Problem 2128 最长子串
Problem 2128 最长子串
Accept: 55 Submit: 209
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
lgcstraightlalongahisnstreet 5 str long tree biginteger ellipse
Sample Output
12
Source
福州大学第十届程序设计竞赛#include<iostream> #include<string> #include<cstdio> #include<cstring> #include<vector> #include<cmath> #include<algorithm> #define maxn 100002 #define LL long long using namespace std ; struct node { int x , y ; }qe[maxn]; char a[maxn] , b[maxn] ; int len ; int cmp( node a , node b ) { return a.x < b.x ; } void find() { int n , m , i , pos = 0 ; m = strlen(b) ; while(strstr(a+pos,b) != NULL ) { i = strstr(a+pos,b)-a ; qe[len].x = i ; qe[len].y = i+m-1 ; pos = qe[len].y ; len++ ; } } int main() { int i ,k ,j ; int n , m , ans ; // freopen("in.txt","r",stdin) ; while( scanf("%s",a) != EOF ) { len = 0 ; cin >> m ; while(m--) { scanf("%s",b) ; find() ; } if(!len) { cout << strlen(a) << endl; continue ; } sort(qe,qe+len,cmp) ; ans = -1 ; qe[len].x = qe[len].y = strlen(a) ; for( i = 0 ; i < len ;i++ ) { k = qe[i+1].y-qe[i].x-1 ; ans = max(k,ans) ; } cout << ans << endl; } return 0 ; }