首页 > 代码库 > 九度OJ 1535 重叠的最长子串
九度OJ 1535 重叠的最长子串
重叠的最长子串
http://ac.jobdu.com/problem.php?pid=1535
时间限制:1 秒
内存限制:128 兆
- 题目描述:
给定两个字符串,求它们前后重叠的最长子串的长度,比如"abcde"和“cdefg”是"cde",长度为3。
- 输入:
输入可能包含多个测试案例。
对于每个测试案例只有一行, 包含两个字符串。字符串长度不超过1000000,仅包含字符‘a‘-‘z‘。
- 输出:
对应每个测试案例,输出它们前后重叠的最长子串的长度。
- 样例输入:
abcde cdefg
- 样例输出:
3
扩展kmp#include<cstdio>#include<cstring>#include<algorithm>#define N 1000001using namespace std;char s[N],t[N];int lens,lent,len;int nxt[N],extend[N];void getnxtt(){ int a=0; nxt[0]=lent; while(a<lent-1 && t[a]==t[a+1]) a++; nxt[1]=a; int p,l,j; a=1; for(int k=2;k<lent;k++) { p=a+nxt[a]-1,l=nxt[k-a]; if(k-1+l>=p) { j=(p-k+1>0) ? p-k+1 : 0; while(k+j<lent && t[k+j]==t[j]) j++; nxt[k]=j; a=k; } else nxt[k]=l; }}void getextend(){ int a=0,len=min(lens,lent); while(a<len && s[a]==t[a]) a++; extend[0]=a; a=0; int p,l,j; for(int i=1;i<lens;i++) { p=a+extend[a]-1; l=nxt[i-a]; if(i-1+l>=p) { j=(p-i+1>0) ? p-i+1 : 0; while(i+j<lens && j<lent && s[i+j]==t[j]) j++; extend[i]=j; a=i; } else extend[i]=l; }}int main(){ while(scanf("%s%s",s,t)!=EOF) { bool ok=false; lens=strlen(s); lent=strlen(t); getnxtt(); getextend(); for(int i=0;i<lens;i++) if(extend[i]==lens-i) { printf("%d\n",extend[i]); ok=true; break; } if(!ok) puts("0"); }}
九度OJ 1535 重叠的最长子串
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。