Problem 2128 最长子串 (KMP+字符串 好题)
2015-08-27 20:00
387 查看
Problem 2128 最长子串
Accept: 131 Submit: 518
Time Limit: 3000 mSec Memory Limit : 65536 KB
Problem Description
问题很简单,给你一个字符串s,问s的子串中不包含s1,s2...sn的最长串有多长。
Input
输入包含多组数据。第一行为字符串s,字符串s的长度1到10^6次方,第二行是字符串s不能包含的子串个数n,n<=1000。接下来n行字符串,长度不大于100。字符串由小写的英文字符组成。
Output
最长子串的长度
Sample Input
lgcstraightlalongahisnstreet5
str
long
tree
biginteger
ellipse
Sample Output
12//思想: //算出每一个字符串在字符串s中出现的位置,即记录出现的起点位置和终点 //位置。并用一个结构体数组存储下来,然后按终点位置进行排序,字符串s //的终点看做是一个为0 的串,即mark[].s=mark[].e=l;最后从左到右,每后 //一个终点减去前一个起点再减一,记录长度,重复上述操作,取最大的长度, //则为题目所求的最大子串长度。 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define INF 0s3f3f3f3f char a[1000010]; struct zz { int s; int e; }m[1000010]; char b[110]; int p[110]; int k; int cmp(zz a,zz b) { if(a.e==b.e) return a.s<b.s; return a.e<b.e; } void getp() { int i=0,j=-1; int l=strlen(b); p[i]=j; while(i<l) { if(j==-1||b[i]==b[j]) { i++;j++; p[i]=j; } else j=p[j]; } } void kmp() { getp(); int i=0,j=0; int l1,l2; l1=strlen(a); l2=strlen(b); while(i<l1) { if(j==-1||a[i]==b[j]) { i++;j++; if(j==l2) { m[k].e=i-1; m[k].s=i-l2; k++; } } else j=p[j]; } } int main(){ int n; while(scanf("%s",a)!=EOF) { int l1=strlen(a); scanf("%d",&n); k=0; for(int i=0;i<n;i++) { scanf("%s",b); kmp(); } sort(m,m+k,cmp); int len=0; int l=0; m[k].e=m[k].s=l1; for(int i=0;i<=k;i++) { if(m[i].e-l>len) len=m[i].e-l; l=m[i].s+1; } printf("%d\n",len); } return 0; }
相关文章推荐
- checkbox选择并批量删除的JSP源码和后台的交互的应用心得
- android 休眠唤醒机制分析(一)
- LoadRunner Controller无法创建Vuser。确保您的Load Generator可用并且脚本有效
- poj 2182 树状数组
- Apache安装
- Spark Core and Cluster Managers(翻译自Learning.Spark.Lightning-Fast.Big.Data.Analysis)
- 第2章 基本数据类型、数组、循环及条件表达式
- IoT service,mqtt,publish topic different from subscribe topic
- axis2之实现方式xmlbeans
- C/C++编程题之大数相乘
- Hibernate3使用(三)Spring整合Hibernate自动扫描
- Android开发中Activity跳转动画以及finish动画
- linux下执行aapt时,提示/usr/lib/libz.so.1 no version information available
- 什么是自动装箱?和自动拆箱?
- HDU 1568 Fibonacci(科学计数法+对数)
- hdu 1690 Bus System
- 关于android客户端的导航栏(toolbar)
- Android菜单
- python---序列可使用的内建函数(BIFs)
- 手势识别器