Description
母亲节就要到了,小 H 准备送给她一个特殊的项链。这个项链可以看作一个用小写字
母组成的字符串,每个小写字母表示一种颜色。为了制作这个项链,小 H 购买了两个机器。第一个机器可以生成所有形式的回文串,第二个机器可以把两个回文串连接起来,而且第二个机器还有一个特殊的性质:假如一个字符串的后缀和一个字符串的前缀是完全相同的,那么可以将这个重复部分重叠。例如:aba和aca连接起来,可以生成串abaaca或 abaca。现在给出目标项链的样式,询问你需要使用第二个机器多少次才能生成这个特殊的项链。
Input
输入数据有多行,每行一个字符串,表示目标项链的样式。
Output
多行,每行一个答案表示最少需要使用第二个机器的次数。
Sample Input
abcdcba abacada abcdef
Sample Output
0 2 5
HINT
每个测试数据,输入不超过 5行
每行的字符串长度小于等于 50000
Solution
先manacher求出len数组 然后问题就可以转化成线段区间完全覆盖问题 贪心就可以了
Code
1 #include2 #include 3 #include 4 #include 5 #define N (100000+1000) 6 using namespace std; 7 8 struct Node{ int x,y;}L[N]; 9 bool cmp(Node a,Node b){ return a.x maxn) x=1;19 else x=min(maxn-i+1,len[mid*2-i]);20 while (s[i+x]==s[i-x]) ++x;21 len[i]=x;22 if (i+x-1>maxn) maxn=i+x-1,mid=i;23 }24 }25 26 int main()27 {28 while (scanf("%s",a)!=EOF)29 {30 n=strlen(a);31 tot=0;32 s[++tot]='@'; s[++tot]='#';33 for (int i=0; i