http://acm.hdu.edu.cn/showproblem.php?pid=5340
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
For each test case , there is an single line contains a string S which only consist of lowercase English letters.1|s|20000
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int t,n,len,p[41001]; int pre[40001],suf[40001]; char a[20001],s[41001]; void manacher() { n=0; s[n++]='!'; for(int i=0;i<len;i++) { s[n++]='#'; s[n++]=a[i]; } s[n++]='#'; s[n]='@'; int id=0,pos=0,x; for(int i=1;i<=n;i++) { if(pos>i) x=min(p[id*2-i],pos-i); else x=1; while(s[i+x]==s[i-x]) x++; if(i+x>pos) { pos=i+x; id=i; } p[i]=x; } } int main() { scanf("%d",&t); while(t--) { scanf("%s",a); len=strlen(a); if(len<3) { printf("No\n"); continue; } manacher(); int l=0,r=0; for(int i=2;i<n-1;i++)//WA 1 :不能 从1到n ,1、n位置是#,不能算 { if(i==p[i]) pre[++l]=i+p[i]-1; if(i+p[i]-1==n-1) suf[++r]=i-p[i]+1; } int t1,t2,mid; bool ok=false; for(int i=1;i<=l;i++) { for(int j=1;j<=r;j++) { t1=pre[i],t2=suf[j]; t1++;t2--; if(t1>t2) continue;///////// WA 2 mid=t1+t2>>1; if(mid+p[mid]-1>=t2) { ok=true; break; } } if(ok) break; } if(ok) printf("Yes\n"); else printf("No\n"); } }