题目链接:http://poj.org/problem?id=3376
update:已解决here
未解决!!!
下面代码明显会TLE-_-||
新的方法还不理解以后再看。
1 #include<cstdio> 2 #include<string> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=2001000; 7 string s[maxn]; 8 string t; 9 int r[2000010]; 10 int ans; 11 void manacher(string s) 12 { 13 14 int id=0,m=0; 15 int len=s.length(); 16 for(int i=len;i>=0;i--) 17 { 18 s[i*2+2]=s[i]; 19 s[i*2+1]='#'; 20 } 21 s[0]='*'; 22 for(int i=2;i<len*2+1;i++) 23 { 24 if(id+r[id]>i) r[i]=min(r[id*2-i],r[id]+id-i); 25 else r[i]=1; 26 while(s[i-r[i]]==s[i+r[i]]) r[i]++; 27 if(id+r[id]<i+r[i]) id=i; 28 if(m<r[id]) m=r[id]; 29 if(m==len+1) {ans++;return ;} 30 } 31 return ; 32 } 33 int main() 34 { 35 int n; 36 //while(scanf("%d",&n)!=EOF) 37 scanf("%d",&n); 38 { 39 ans=0; 40 int x; 41 for(int i=0;i<n;i++){ 42 scanf("%d",&x); 43 cin>>s[i]; 44 } 45 //二重循环,tle 46 for(int i=0;i<n;i++) 47 for(int j=0;j<n;j++) 48 { 49 t=""; 50 t=s[i]+s[j]; 51 manacher(t); 52 } 53 printf("%d ",ans); 54 } 55 }