标签:splay -- 回文串 oid 测试 logs 2.0 fine problem
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
aaaa -------------//忽视 分割线 下同 abab
4 ------------- 3
1 /* 2 裸的manache考虑三种情况 3 */ 4 #include<cstdio> 5 #include<cstring> 6 #include<iostream> 7 #define MAXN 110010 8 9 using namespace std; 10 11 char s[MAXN]; 12 13 int L,l,ans; 14 15 int t[MAXN*3],len[MAXN*3]; 16 17 inline void init() { 18 t[l++]=‘$‘; 19 t[l++]=‘#‘; 20 for(int i=0;i<L;i++) { 21 t[l++]=s[i]; 22 t[l++]=‘#‘; 23 } 24 t[l]=0; 25 return; 26 } 27 28 inline void manache(){ 29 int p=0,p0=0; 30 for(int i=1;i<=l;i++) { 31 if(p>i) len[i]=min(len[2*p0-i],p-i); 32 else len[i]=1; 33 while(t[i-len[i]]==t[i+len[i]]) len[i]++; 34 if(len[i]+i>p) { 35 p=len[i]+i; 36 p0=i; 37 } 38 ans=max(ans,len[i]-1); 39 } 40 return; 41 } 42 43 int main () { 44 while(cin>>s) { 45 L=l=ans=0; 46 L=strlen(s); 47 if(!L) break; 48 init(); 49 manache(); 50 printf("%d\n",ans); 51 } 52 return 0; 53 }
标签:splay -- 回文串 oid 测试 logs 2.0 fine problem
原文地址:http://www.cnblogs.com/whistle13326/p/6785809.html