标签:
Description
Input
Output
Sample Input
yeshowmuchiloveyoumydearmotherreallyicannotbelieveit yeaphowmuchiloveyoumydearmother
Sample Output
27
调了一个晚上,终于写出一份自己风格的SA
#include<cstdio> #include<cstring> #include<algorithm> #define MN 200001 using namespace std; int n,m=0; char s1[MN]; int s[MN],ss[MN]; int v[MN],a[MN],sa[MN],q[MN],rank[MN],h[MN],mmh=0,len; inline void gr(int x){ rank[sa[1]]=1; for (int i=2;i<=m;i++) rank[sa[i]]=(s[sa[i]]==s[sa[i-1]]&&s[sa[i]+x]==s[sa[i-1]+x])?rank[sa[i-1]]:rank[sa[i-1]]+1; for (int i=1;i<=m;i++) s[i]=rank[i]; } inline void qz(){for (int i=1;i<=m;i++) v[i]+=v[i-1];} inline void getsa(){ for (int j=1;j<=m;j++) v[j]=0; for (int i=1;i<=m;i++) v[s[i]]++,ss[i]=s[i];qz(); for (int i=m;i>=1;i--) a[i]=v[s[i]],sa[v[s[i]]--]=i;gr(0); for (int i=1;i<m;i<<=1){ for (int j=1;j<=m;j++) v[j]=0; for (int j=1;j<=m;j++) v[rank[j]]++;qz(); for (int j=m;j>=1;j--) if (sa[j]>i) a[sa[j]-i]=v[rank[sa[j]-i]],q[v[rank[sa[j]-i]]--]=sa[j]-i; for (int j=m-i+1;j<=m;j++) a[j]=v[rank[j]],q[v[rank[j]]--]=j; for (int j=1;j<=m;j++) sa[j]=q[j];gr(i); } } inline void geth(){for (int i=1,k=0,j;i<=m;h[rank[i++]]=k) for (k?k--:0,j=sa[rank[i]-1];ss[i+k]==ss[j+k]&&i+k<=m&&j+k<=m;k++);} int main(){ scanf("%s",s1); len=n=strlen(s1); for (int i=0;i<n;i++) s[++m]=s1[i]-‘a‘+1; scanf("%s",s1); s[++m]=29; n=strlen(s1); for (int i=0;i<n;i++) s[++m]=s1[i]-‘a‘+1; getsa(); geth(); for (int i=2;i<=m;i++) if (mmh<h[i]&&((sa[i]<=len&&sa[i-1]>len)||(sa[i-1]<=len&&sa[i]>len))) mmh=h[i]; printf("%d\n",mmh); }
标签:
原文地址:http://www.cnblogs.com/Enceladus/p/5459820.html