码迷,mamicode.com
首页 > 其他好文 > 详细

Problem 2128 最长子串(kmp+strstr好题经典)

时间:2015-08-27 22:31:39      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

技术分享 Problem 2128 最长子串

Accept: 134    Submit: 523
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
题解:想着把匹配的位置记录下来,记录成区间,关键在于位置内长度的查找,让母串组不成子串,就想着让起始位置加一就破坏了;
kmp代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX(x,y)(x>y?x:y)
const int MAXN=1000010;
char mstr[MAXN];
char str[110];
struct Node{
    int s,e;
};
Node area[MAXN];
int cmp(const void *a,const void *b){
    if((*(Node *)a).e!=(*(Node *)b).e)return (*(Node *)a).e-(*(Node *)b).e;
    else return (*(Node *)a).s-(*(Node *)b).s;
}
int p[110],top;
void getp(){
    int i=0,j=-1;
    p[0]=-1;
    while(str[i]){
        if(j==-1||str[i]==str[j]){
            i++;j++;
            p[i]=j;
        }
        else j=p[j];
    }
}
void kmp(){
    getp();
    int i=0,j=0;
    while(mstr[i]){
        if(j==-1||mstr[i]==str[j]){
            i++;j++;
            if(!str[j])area[top].s=i-j,area[top++].e=i-1;
        }
        else j=p[j];
    }
}
int main(){
    int N;
    while(~scanf("%s",mstr)){
        top=0;
        scanf("%d",&N);
        for(int i=0;i<N;i++){
            scanf("%s",str);
            kmp();
        }
        int ans=0;
        int n=strlen(mstr),t=0,temp;
        area[top].s=n;area[top].e=n;
        qsort(area,top+1,sizeof(area[0]),cmp);
        //for(int i=0;i<=top;i++)printf("%d %d\n",area[i].s,area[i].e);
        for(int i=0;i<=top;i++){
            temp=area[i].e-t;
            ans=MAX(ans,temp);
            t=area[i].s+1;//注意***** 
        }
        printf("%d\n",ans);
    }
    return 0;
}


str函数:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #define MAX(x,y)(x>y?x:y)
 5 const int MAXN=1000010;
 6 char mstr[MAXN];
 7 char str[110];
 8 struct Node{
 9     int s,e;
10 };
11 Node area[MAXN];
12 int cmp(const void *a,const void *b){
13     if((*(Node *)a).e!=(*(Node *)b).e)return (*(Node *)a).e-(*(Node *)b).e;
14     else return (*(Node *)a).s-(*(Node *)b).s;
15 }
16 int top;
17 int main(){
18     int N;
19     while(~scanf("%s",mstr)){
20         top=0;
21         scanf("%d",&N);
22         for(int i=0;i<N;i++){
23             scanf("%s",str);
24             int len=strlen(str),c=0;
25             while(strstr(mstr+c,str)){
26                 area[top].s=strstr(mstr+c,str)-mstr;
27                 area[top].e=area[top].s+len-1;
28                 c=area[top].s+len-1;
29                 top++;
30             }
31         }
32         int ans=0;
33         int n=strlen(mstr),t=0,temp;
34         area[top].s=n;area[top].e=n;
35         qsort(area,top+1,sizeof(area[0]),cmp);
36         //for(int i=0;i<=top;i++)printf("%d %d\n",area[i].s,area[i].e);
37         for(int i=0;i<=top;i++){
38             temp=area[i].e-t;
39             ans=MAX(ans,temp);
40             t=area[i].s+1;
41         }
42         printf("%d\n",ans);
43     }
44     return 0;
45 }

 

Problem 2128 最长子串(kmp+strstr好题经典)

标签:

原文地址:http://www.cnblogs.com/handsomecui/p/4764736.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!