FZUOJ-2128 最长子串(strstr函数枚举暴力)

来源:互联网 发布:python apscheduler 编辑:程序博客网 时间:2024/06/06 03:20

FZUOJ Problem-2128 最长子串(枚举)

accept: 183 submit: 669 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

题意:开始理解错误,重新看一遍才懂,在母串s里,求不包含s1,s2…sn的最长串,输出长度。话不多说,看案例:
原串:lgc–str–aightla–long–ahisn—stree—–t
长度: 3 – s1 — 7 —— s2 —- 5—- s3 - s4 - 1
可以看出其中最长的是:tr aightla lon 共 12 (去掉了第一个str的’s’和long的’g’)
其他案例:
asdasasdsa
2
as
das
4
sadasdas
2
q
w
8

但是,注意最后一个案例,如果Sn并不被S包含,那么母串S就最长串。
由于输出的是长度,求sta和结束end的下标,开始是自己模拟敲的,但是Time Exceed(n^2)= =!!

        for(i=0;i<strlen(s); i++){//判断子串 time exceed!!!                 flag = 1;                for(j=0; s1[j]!='\0'; j++){                    if(s1[j]!= s[i+j]){                        flag = 0;                        break;                    }                }                if(flag){                       per[count].sta = i;                    per[count++].end = j+i-1;                    i = i+j-1;                }            }

百度大神们的是strstr()返回子串的S1在S位置,就枚举一一;再sort/qsort按sta排序。
计算长度的主要公式的是: SunSum[count] = per[i].end - per[i-1].sta - 1;然后求max,上代码:

#include"iostream"#include"cstring"#include"cstdio"#include"algorithm"using namespace std;char s[1000005];struct node {    int sta;    int end;}per[1000005];int cmp(node a,node b){    return a.sta<b.sta;}int main(){    int flag;    int i,j,k,n,max,count,sum;    char s1[160];    while(gets(s)){        cin>>n;        getchar();        count = 0;        for(k=0; k<n; k++){//n次输入             gets(s1);            i = 0;             while(strstr(s+i,s1)!=NULL) {                  j = strstr(s+i,s1)-s;                  per[count].sta = j;                  per[count].end = strlen(s1)+j-1;                  i = per[count].end;                  count++;              }         }        per[count].sta = per[count].end = strlen(s);        sort(per,per+count+1,cmp);//      for(int i=0;i<=count;i++){//          printf("%d=>%d %d\n",i,per[i].sta,per[i].end);//      }         sum = per[0].end - 1;        max = max>sum?-1:sum;         for(i=1; i<=count; i++){            sum = per[i].end - per[i-1].sta-1;            max = max>sum?max:sum;          }        if(!count)cout<<strlen(s)<<endl; //S中不存在Sn把S输出         else cout<<max<<endl;    }
1 0
原创粉丝点击