标签:pac big lov really tor 论文题 tput send output
Time Limit: 4000MS | Memory Limit: 131072K | |
Total Submissions: 31904 | Accepted: 12876 | |
Case Time Limit: 1000MS |
Description
Input
Output
Sample Input
yeshowmuchiloveyoumydearmotherreallyicannotbelieveit yeaphowmuchiloveyoumydearmother
Sample Output
27
Source
//论文题,一个字符串的最长重复子串就是heigh数组的最大值,这里把后一个字符串接到前一个的前面中间用一个字符分开,然后求不在 //同一个字符串中的最大的heigh数组值。 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAXN=300000; int sa[MAXN+9],he[MAXN+9],ra[MAXN+9],xx[MAXN+9],yy[MAXN+9],buc[MAXN+9],f[MAXN+9][30]; char s[MAXN+9]; int len,m; void get_suf() { int *x=xx,*y=yy; for(int i=0;i<m;i++) buc[i]=0; for(int i=0;i<len;i++) buc[x[i]=s[i]]++; for(int i=1;i<m;i++) buc[i]+=buc[i-1]; for(int i=len-1;i>=0;i--) sa[--buc[x[i]]]=i; for(int k=1;k<=len;k<<=1){ int p=0; for(int i=len-1;i>=len-k;i--) y[p++]=i; for(int i=0;i<len;i++) if(sa[i]>=k) y[p++]=sa[i]-k; for(int i=0;i<m;i++) buc[i]=0; for(int i=0;i<len;i++) buc[x[y[i]]]++; for(int i=1;i<m;i++) buc[i]+=buc[i-1]; for(int i=len-1;i>=0;i--) sa[--buc[x[y[i]]]]=y[i]; swap(x,y); p=1;x[sa[0]]=0; for(int i=1;i<len;i++){ if(y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]) x[sa[i]]=p-1; else x[sa[i]]=p++; } if(p>=len) break; m=p; } for(int i=0;i<len;i++) ra[sa[i]]=i; int k=0; for(int i=0;i<len;i++){ if(ra[i]==0) { he[0]=0; continue; } if(k) k--; int j=sa[ra[i]-1]; while(s[i+k]==s[j+k]&&i+k<len&&j+k<len) k++; he[ra[i]]=k; } } int solve(int len1) { int ans=0; for(int i=1;i<len;i++){ if(he[i]>ans&&((sa[i]>len1&&sa[i-1]<len1)||(sa[i]<len1&&sa[i-1]>len1))) ans=he[i]; } return ans; } int main() { scanf("%s",s); int len1=strlen(s); s[len1]=‘#‘; scanf("%s",s+len1+1); len=strlen(s); m=200; get_suf(); printf("%d\n",solve(len1)); return 0; }
标签:pac big lov really tor 论文题 tput send output
原文地址:http://www.cnblogs.com/--ZHIYUAN/p/7617953.html