Description
问题很简单,给你一个字符串s,问s的子串中不包含s1,s2...sn的最长串有多长。
Input
输入包含多组数据。第一行为字符串s,字符串s的长度1到10^6次方,第二行是字符串s不能包含的子串个数n,n<=1000。接下来n行字符串,长度不大于100。
字符串由小写的英文字符组成。
Output
最长子串的长度
Sample Input
lgcstraightlalongahisnstreet 5 str long tree biginteger ellipse
Sample Output
12
利用strstr 找到每个字符存在的位置 并标记首尾的位置a[k].l ,a[k].r 利用r的位置升序快拍
可以思考 第一个肯定是a[0].r最后一个肯定是len-a[k-1].l-1;
中间的利用前一个来计算
即两种情况 如下
#include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<math.h> using namespace std; #define INF 0x3f3f3f3f #define N 1234567 char str[N],s[N]; struct node { int l,r; }a[N]; int cmp(node e,node f) { if(e.r!=f.r) return e.r<f.r; return e.l<f.l; } int main() { int n,len,q,len1; while(scanf("%s",str)!=EOF) { memset(a,0,sizeof(a)); int k=0; scanf("%d",&n); len=strlen(str); for(int i=0;i<n;i++) { scanf("%s",s); len1=strlen(s); q=0; while(1) { q=strstr(str+q,s)-str; ///printf("%d ",q); if(q<0||q>=len) break; a[k].l=q; a[k].r=q+len1-1; k++; q++; } } sort(a,a+k,cmp); if(k==0)///特殊情况优先输出 { printf("%d ",len); continue; } int m=max(len-a[k-1].l-1,a[0].r); for(int i=1;i<k;i++) { if(a[i].l<=a[i-1].l) ///两种情况相差1 但是很重要 有明显的区别 自行画下就可以发现 m=max(m,a[i].r-a[i-1].l); else m=max(m,a[i].r-a[i-1].l-1); } printf("%d ",m); } return 0; }