求最长回文字串。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=2000+10; 6 char s[maxn]; 7 int sa[maxn],t[maxn],t2[maxn],c[maxn]; 8 int rank[maxn],height[maxn]; 9 void build_sa(int n,int m) 10 { 11 int i,*x=t,*y=t2; 12 for(i=0;i<m;i++) c[i]=0; 13 for(i=0;i<n;i++) c[x[i]=s[i]]++; 14 for(i=1;i<m;i++) c[i]+=c[i-1]; 15 for(i=n-1;i>=0;i--) sa[--c[x[i]]]=i; 16 17 for(int k=1;k<=n;k<<=1) 18 { 19 int p=0; 20 for(i=n-k;i<n;i++) y[p++]=i; 21 for(i=0;i<n;i++) if(sa[i]>=k) y[p++]=sa[i]-k; 22 23 for(i=0;i<m;i++) c[i]=0; 24 for(i=0;i<n;i++) c[x[y[i]]]++; 25 for(i=1;i<m;i++) c[i]+=c[i-1]; 26 for(i=n-1;i>=0;i--) sa[--c[x[y[i]]]]=y[i]; 27 28 swap(x,y); 29 p=1;x[sa[0]]=0; 30 for(i=1;i<n;i++) 31 x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++; 32 if(p>=n) break; 33 m=p; 34 } 35 } 36 void getHeight(int n) 37 { 38 int k=0,i; 39 for(i=1;i<=n;i++) rank[sa[i]]=i; 40 for(i=0;i<n;i++) 41 { 42 if(k) k--; 43 int j=sa[rank[i]-1]; 44 while(s[i+k]==s[j+k]) k++; 45 height[rank[i]]=k; 46 } 47 } 48 int rmq(int a,int b) 49 { 50 a=rank[a],b=rank[b]; 51 if(a>b) swap(a,b); 52 int minv=height[a+1]; 53 for(int i=a+1;i<=b;i++) 54 if(height[i]<minv) 55 minv=height[i]; 56 return minv; 57 } 58 int main() 59 { 60 while(gets(s)) 61 { 62 int n=strlen(s); 63 int len=n; 64 s[n]='$'; 65 for(int i=0;i<n;i++) 66 s[n+1+i]=s[n-1-i]; 67 n=2*n+1; 68 s[n]='