HDU 3294 马拉车算法

该算法,对于任意一个在最后 串中的pos位置,都对应原串的(pos-malache[pos]+2)/2-1位置,且长度为为malache[pos]-1


这样就很容易直接求出所有回文位置了。


模板依旧用上一篇文章的模板


/*
#include 
#include 
#include 
#include 
using std::tr1::unordered_map;
*/

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

/*
   using std::sort;
   using std::bitset;
   using std::max;
   using std::cout;
   using std::stack;
   using std::cin;
   using std::endl;
   using std::swap;
   using std::pair;
   using std::vector;
   using std::set;
   using std::map;
   using std::multiset;
   using std::queue;
   using std::greater;
   using std::string;
   using std::priority_queue;
   using std::max_element;
   using std::min_element;

   using __gnu_pbds::pairing_heap_tag;
   __gnu_pbds::priority_queue, pairing_heap_tag> heap;
#define Hash unordered_map
*/
#define pr(x) cout<<#x<<" = "<ans)
			{
				ans = malache[i];
				pos = i;
			}
		}
		ans--;
		if (ans==1)
			printf("No solution!\n");
		else
		{
			if (pos%2==0)
			{
				//如果是偶数,则为pos/2-1为中点
				//pos-malache[pos]+1为起点
				//起点为 (pos-malache[pos]+1)/2-1为起点,长为malache[pos]-1
				printf("%d %d\n", (pos-malache[pos]+2)/2-1, (pos-malache[pos]+2)/2-1+ans-1);
			}
			else
			{
				//如果是奇数,则说明为aa或者baab这样的回文串
				//(pos-malache[pos])/2为起点,长度为malache[pos]-1
				printf("%d %d\n", (pos-malache[pos]+2)/2-1, (pos-malache[pos]+2)/2-1+ans-1);
			}
			for (int i = (pos-malache[pos])/2; i <= (pos-malache[pos])/2 + ans - 1; ++ i)
				printf("%c", input[i]);
			printf("\n");
		}
	}
}


你可能感兴趣的:(manacher)