poj 2774 求两个字符串的最长公共子串
来源:互联网 发布:学生空间七天网络查分 编辑:程序博客网 时间:2024/05/14 16:15
#include<stdio.h>#include<iostream>#include<string.h>#define N 200005using namespace std;char str[N];int s[N],t1[N],t2[N],c[N],sa[N],height[N],ran[N];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[n]='$'; 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;}
0 0
- poj 2774 求两个字符串的最长公共子串
- poj 2774 求两个字符串的最长公共子串
- POJ 2774 Long Long Message(2.3 求两个字符串的最长公共子串)
- Poj 2774两个字符串的最长公共子串长度
- 求两个字符串最长公共子串
- 求两个字符串的最长的连续公共子串
- 求两个字符串的最长的连续公共子串
- 求两个字符串的最长的连续公共子串
- 求两个字符串的最长的连续公共子串
- 求两个字符串的最长公共子串的长度
- 求两个字符串的最长公共子串的长度
- VB6求两个字符串最长公共子串的问题
- 求两个字符串的最长公共子串(LCS)
- 求两个字符串的最长公共子串
- 求两个字符串的最长公共子串
- 求两个字符串的最长公共子串(LCS)
- 求两个字符串最长公共子串的问题
- 求两个字符串的最长公共子串
- 【0】开始学习安卓了
- .net甘特图控件免费下载地址
- 学C++备用资料
- 黑马程序员——Java基础语法(三)—函数、数组
- 使用python脚本登陆ef英语学习中心
- poj 2774 求两个字符串的最长公共子串
- 无法打开ddraw.lib问题的解决 -- 将DirectX引入到VS工程中
- SQL_字符操作函数
- Android 欢迎界面的三种实现方式
- 编程环境的说明
- 算法:KMP
- 多比(SVG/VML)图形控件拓扑图控件免费下载
- JOAL学习笔记 第一课 单一固定声源
- Spring之事物的同步资源管理