POJ3974 (manacher模版题)
题目链接:http://poj.org/problem?id=3974
题意:给定一个字符串,求最长回文。
题解:manacher算法模版题。
代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 const int maxn = 1000000+50; 7 char s[maxn<<1]; 8 int p[maxn<<1]; 9 void manacher() 10 { 11 int len=strlen(s); 12 for(int i=len;i>=0;i--) 13 { 14 s[i+i+2] = s[i]; 15 s[i+i+1] = '#'; 16 } 17 s[0] = '*'; 18 int id,mx = 0; 19 for(int i=1;i<len+len+1;i++) 20 { 21 if(mx>1) p[i] = min(p[2*id-i],mx-i); 22 else p[i] = 1; 23 while(s[i-p[i]]==s[i+p[i]]) p[i]++; 24 if(i+p[i]>mx) 25 { 26 id=i; 27 mx = p[i] + i; 28 } 29 } 30 } 31 int main() 32 { 33 int test; 34 cin>>test; 35 int temp=1; 36 while(~scanf("%s",s)) 37 { 38 if(s[0]=='E'&&s[1]=='N'&&s[2]=='D') 39 break; 40 int len=strlen(s); 41 manacher(); 42 printf("Case %d: ",temp++); 43 int mx = -1; 44 for(int i=1;i<len+len+1;i++) 45 if(p[i]>mx) 46 mx = p[i]; 47 printf("%d\n",mx-1); 48 } 49 }
浙公网安备 33010602011771号