poj 2774
2011-03-10 16:31
190 查看
后缀数组
代码:
代码:
#include<iostream> #include<fstream> using namespace std; int sa[200003],sa1[200003],rank1[200003]; int rank[200003],y[200003],h[200003]; int pow=1; char m[200004]; int c[200003]; int cmp2(const void *a,const void *b){ int x=*(int*)a; int y=*(int*)b; if(rank[x]!=rank[y]) return(rank[x]-rank[y]); else return(rank[x+pow]-rank[y+pow]); } void creat(int n){ int i,j,t; for(i=0;i<=256;i++) c[i]=0; for(i=0;i<n;i++) c[m[i]]++; for(i=1;i<=256;i++) c[i]+=c[i-1]; for(i=n-1;i>=0;i--) sa[--c[m[i]]]=i; for(i=0,j=0;i<n;i++) { if(i>0&&m[sa[i]]!=m[sa[i-1]]) j++; rank[sa[i]]=j; } for(pow=1;pow<n;pow*=2) { for(i=0;i<n;i++) c[i]=0; for(i=0;i<n;i++) if(sa[i]+pow<n) c[rank[sa[i]+pow]]++; else c[rank[sa[i]]]++; for(i=1;i<n;i++) c[i]+=c[i-1]; for(i=n-1;i>=0;i--) if(sa[i]+pow<n) sa1[--c[rank[sa[i]+pow]]]=sa[i]; else sa1[--c[rank[sa[i]]]]=sa[i]; for(i=0;i<n;i++) c[i]=0; for(i=0;i<n;i++) c[rank[sa1[i]]]++; for(i=1;i<n;i++) c[i]+=c[i-1]; for(i=n-1;i>=0;i--) sa[--c[rank[sa1[i]]]]=sa1[i]; j=0; for(i=0;i<n;i++) { if(i>0&&cmp2(&sa[i],&sa[i-1])!=0) j++; rank1[sa[i]]=j; } for(i=0;i<n;i++) rank[i]=rank1[i]; } } void height(int n){ int i,j,k=0; for(i=0;i<n;i++) { if(rank[i]==0) h[rank[i]]=k=0; else { if(k>0) k--; j=sa[rank[i]-1]; for(;m[i+k]==m[j+k];k++); h[rank[i]]=k; } } } int judge(int s,int t){ if(sa[s]<t&&sa[s-1]<t) return(0); if(sa[s]>t&&sa[s-1]>t) return(0); return(1); } int main(){ //ifstream cin("in.txt"); int i,j,k,t; cin>>m; //scanf("%s",m); k=strlen(m); t=k; m[k]=2; cin>>m+k+1; //scanf("%s",m+k+1); k=strlen(m); m[k]=1; k++; creat(k); height(k); j=0; for(i=1;i<k;i++) if(j<h[i]&&judge(i,t)) j=h[i]; cout<<j<<endl; return(0); }
相关文章推荐
- poj 2774
- POJ 2774 Long Long Message (最长公共子串)
- POJ 2774 Long Long Message (后缀数组模板)
- POJ 2774 Long Long Message(后缀数组)
- POJ 2774 Long Long Message (后缀数组求最长公共子串)
- POJ2774 Long Long Message(后缀数组)
- POJ 2774 Long Long Message
- ●POJ 2774 Long Long Message
- poj 2774 后缀数组 最长公共子串
- POJ 2774 Long Long Message(后缀数组:倍增算法)
- 【倍增后缀数组】 poj1743 &2406& 3261 & 3294 & 2774
- 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774
- 后缀数组小模板 POJ 2774
- POJ 2774 - Long Long Message
- POJ 2774 Long Long Message
- cogs1713 [POJ2774]很长的信息
- POJ-2774 Long Long Message 后缀数组
- poj 2774 Long Long Message(后缀数组入门题)
- POJ 2774 Long Long Message(后缀数组)
- 【POJ 2774】Long Long Message 最长公共子串