poj 2774 求两个字符串的最长公共子串
2014-10-18 17:39
337 查看
#include<stdio.h> #include<iostream> #include<string.h> #define N 200005 using namespace std; char str ; int s ,t1 ,t2 ,c ,sa ,height ,ran ; void build_sa(int *s,int n,int m) { int *x=t1,*y=t2,p,i,k; for(i=0;i<m;i++) c[i]=0; for(i=0;i<n;i++) c[x[i]=s[i]]++; for(i=1;i<m;i++) c[i]+=c[i-1]; for(i=n-1;i>=0;i--) sa[--c[x[i]]]=i; for(k=1;k<=n;k<<=1) { p=0; for(i=n-k;i<n;i++) y[p++]=i; for(i=0;i<n;i++) if(sa[i]>=k) y[p++]=sa[i]-k; for(i=0;i<m;i++) c[i]=0; for(i=0;i<n;i++) c[x[y[i]]]++; for(i=1;i<m;i++) c[i]+=c[i-1]; for(i=n-1;i>=0;i--) sa[--c[x[y[i]]]]=y[i]; p=1; swap(x,y); x[sa[0]]=0; for(i=1;i<n;i++) x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k] ? p-1:p++; if(p>=n) break; m=p; } } void getheight(int n) { int i,j,k=0; for(i=0;i<n;i++) ran[sa[i]]=i; for(i=0;i<n;i++) { if(k) k--; j=sa[ran[i]-1]; while(s[i+k]==s[j+k]) k++; height[ran[i]]=k; } } int main() { int n,m,i,max; while(scanf("%s",str)!=EOF) { n=strlen(str); str ='$'; scanf("%s",str+n+1); m=strlen(str); for(i=0;i<m;i++) s[i]=str[i]; build_sa(s,m,130); getheight(m); max=-1; for(i=1;i<m;i++) { if((sa[i]<n&&sa[i-1]>n||(sa[i]>n&&sa[i-1]<n))&&height[i]>max) max=height[i]; } printf("%d\n",max); } return 0; }
相关文章推荐
- poj 2774 Long Long Message 求两个字符串的最长公共子串 后缀数组
- poj 2774 后缀数组 两个字符串的最长公共子串
- POJ 2774 Long Long Message(2.3 求两个字符串的最长公共子串)
- 【后缀数组】 POJ 2774 Long Long Message 两个字符串的最长公共子串长度
- poj 2774 求两个字符串的最长公共子串
- (Relax 后缀数组1.4)POJ 2774 Long Long Message(求两个字符串公共子串的最大长度)
- POJ 2774 找出2字符串 最长公共连续子串
- poj 2774 最长公共子串--字符串hash或者后缀数组或者后缀自动机
- 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774
- POJ 2774 Long Long Message(后缀数组 两个字符串的最长公共字串 )
- poj2774 后缀数组2个字符串的最长公共子串
- 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774
- 求两个字符串的最长公共子串
- 求两个字符串最长公共子串LCS(其它)
- POJ 2774 Long Long Message(最长公共子串)
- 求两个字符串最长公共子串(LCS问题) 两种思想
- 找出两个字符串最长公共子串
- 算法:用数组求两个字符串最长的公共子串
- 实用算法实现-第 8 篇 后缀树和后缀数组 [3 两个字符串的最长公共子串]
- poj 2774 后缀数组 最长公共子串