P3375 【模板】KMP字符串匹配

题目描述

如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置。

为了减少骗分的情况,接下来还要输出子串的前缀数组next。如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了。

输入输出格式

输入格式:

 

第一行为一个字符串,即为s1(仅包含大写字母)

第二行为一个字符串,即为s2(仅包含大写字母)

 

输出格式:

 

若干行,每行包含一个整数,表示s2在s1中出现的位置

接下来1行,包括length(s2)个整数,表示前缀数组next[i]的值。

 

输入输出样例

输入样例#1:
ABABABC
ABA
输出样例#1:
1
3
0 0 1 

说明

时空限制:1000ms,128M

数据规模:

设s1长度为N,s2长度为M

对于30%的数据:N<=15,M<=5

对于70%的数据:N<=10000,M<=100

对于100%的数据:N<=1000000,M<=1000

样例说明:

所以两个匹配位置为1和3,输出1、3

 靠TM的,用string写,AC,用char 数组写,三个点TLE我日,不是说STl比较慢吗!!

AC代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 string s,p;
 6 int next[1002];
 7 void getNext(string p){
 8     int j=0,k=-1;
 9     next[0]=-1;
10     while(j<p.length()){
11         if(k==-1||p[j]==p[k]){
12             j++;k++;next[j]=k;
13         }
14         else k=next[k];
15     }
16 }
17 void KMPmatch(string s,string p){
18     int i=0,j=0;
19     getNext(p);
20     while(i<s.length()){
21         if(j==-1||s[i]==p[j]) { i++;j++; }
22         else j=next[j];
23         if(j==p.length()) {
24             printf("%d\n",i-p.length()+1);
25             j=0,i--;
26         }
27     }
28     for(int i=1;i<=p.length();i++)
29       printf("%d ",next[i]);
30 }
31 int main()
32 {
33     cin>>s>>p;
34     KMPmatch(s,p);
35     return 0;
36 } 

70分TLE代码:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char s[1000005],p[1002];
void getNext(char *p,int *next){
    int j=0,k=-1;
    next[0]=-1;
    while(j<strlen(p)){
        if(k==-1||p[j]==p[k]){
            j++;k++;next[j]=k;
        }
        else k=next[k];
    }
}
void KMPmatch(char *s,char *p){
    int next[1002],i=0,j=0;
    getNext(p,next);
    while(i<strlen(s)){
        if(j==-1||s[i]==p[j]) { i++;j++; }
        else j=next[j];
        if(j==strlen(p)) {
            printf("%d\n",i-strlen(p)+1);
            j=0,i--;
        }
    }
    for(int i=1;i<=strlen(p);i++)
      printf("%d ",next[i]);
}
int main()
{
    //scanf("%s%s",s,p);
    cin>>s>>p;
    KMPmatch(s,p);
    return 0;
} 

  

posted @ 2017-01-14 16:34  浮华的终成空  阅读(195)  评论(0编辑  收藏  举报

Contact with me