fzu Problem 2128 最长子串 (注意strstr函数的使用)

来源:互联网 发布:blooming服装 知乎 编辑:程序博客网 时间:2024/05/22 01:51

1、http://acm.fzu.edu.cn/problem.php?pid=2128

2、题目:

对于每个子串,求出 母串中 所有该子串 的 开始和结束位置,保存在 mark数组中,求完所有子串后,对mark数组按 结束位置排序,然后 用后一个的结束位置 减去 前一个的 开始 位置 再 减去 1,记录最大值,

Problem 2128 最长子串

Accept: 50    Submit: 198
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

lgcstraightlalongahisnstreet5strlongtreebigintegerellipse

Sample Output

12

 

3、代码:

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define N 1000005char str[N];char sub[105];int cnt;struct node{    int start;    int end;}a[N];int cmp(node a,node b){    return a.end<b.end;}void solve(char s1[N],char s2[105])//s1原串,s2子串{    int idx=0;    int len=strlen(s2);    while(strstr(s1+idx,s2)!=NULL)    {        int s=strstr(s1+idx,s2)-s1;        a[cnt].start=s;        a[cnt].end=s+len-1;        idx=a[cnt].end;        cnt++;    }}int main(){    int n;    while(scanf("%s",str)!=EOF)    {        scanf("%d",&n);        cnt=0;        int l=strlen(str);        for(int i=0;i<n;i++)        {            scanf("%s",sub);            solve(str,sub);        }        a[cnt].start=l;        a[cnt].end=l;        cnt++;        sort(a,a+cnt,cmp);        int ans=-1;        for(int i=0;i<cnt-1;i++)        {            int tmp=a[i+1].end-a[i].start-1;            if(tmp>ans)            ans=tmp;        }        if(ans==-1)        printf("%d\n",l);        else        printf("%d\n",ans);    }    return 0;}/*lgcstraightlalongahisnstreet5strlongtreebigintegerellipse*/


 

原创粉丝点击