标签:
输入包含多组数据。第一行为字符串s,字符串s的长度1到10^6次方,第二行是字符串s不能包含的子串个数n,n<=1000。接下来n行字符串,长度不大于100。
字符串由小写的英文字符组成。
#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