标签:
1 #include <stdio.h>
2 #include <iostream>
3 #include <algorithm>
4 #include <string.h>
5 using namespace std;
6
7
8 char a[110010], b[220010];
9 int p[220010];
10 int main()
11 {
12 int n, ma, r, t, x;
13 while(~scanf("%s", &a[1]))
14 {
15 getchar();
16 x=strlen(a+1);
17 b[0]=‘%‘;
18 b[1]=‘#‘;
19 //printf("~%d",x);
20 for(int i=1; i<=x; i++)
21 {
22 b[2*i]=a[i];
23 b[2*i+1]=‘#‘;
24 //printf("%c%c",b[2*i],b[2*i+1]);
25 }
26 b[2*x+2]=‘$‘;
27
28 t=ma=r=0;
29 for(int i=1; i<=2*x+1; i++)
30 {
31 if(r>i) //如果遍历的该点已经小于最长的半径,则不用考虑该点
32 {
33 p[i]=min(r-i, p[t-(i-t)]);//优化避免重复匹配
34 }
35 else
36 {
37 p[i]=1;
38 }
39 while(b[i+p[i]]==b[i-p[i]])
40 {
41 p[i]++;
42 }
43
44
45 if(p[i]+i>r)
46 {
47 r=p[i]+i; //记录延伸最长的posiition值
48 t=i;
49 }
50 /////
51 if(ma<p[i])
52 ma=p[i];
53 }
54 printf("%d\n", ma-1);
55 }
56 }
标签:
原文地址:http://www.cnblogs.com/Yumesenya/p/5347462.html