HDU 3068(manacher模版题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068
题意:求最长回文串的长度。
题解:纯模版。
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 const int maxn =200000+50; 7 char s[maxn<<1]; 8 int p[maxn<<1]; 9 int mxx,iid; 10 void manacher() 11 { 12 mxx=-1; 13 int len=strlen(s); 14 for(int i=len;i>=0;i--) 15 { 16 s[i+i+2] = s[i]; 17 s[i+i+1] = '#'; 18 } 19 s[0] = '*'; 20 int id,mx=0; 21 for(int i=1;i<len+len+2;i++) 22 { 23 if(mx>1) p[i] = min(p[2*id-i],mx-i); 24 if(p[i]==0) p[i]=1; 25 while(s[i-p[i]]==s[i+p[i]])p[i]++; 26 if(i+p[i]>mx) 27 { 28 mx=i+p[i]; 29 id=i; 30 } 31 if(p[i]-1>mxx) 32 { 33 mxx=p[i]-1; 34 iid=i; 35 } 36 } 37 printf("%d\n",mxx); 38 } 39 40 int main() 41 { 42 while(~scanf("%s",s)) 43 manacher(); 44 }
浙公网安备 33010602011771号