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<=1000000

 

第一次在這個oj上刷題,發現評判是真的很嚴格,定義多餘的變量竟然也會判錯。。。。。

#include<bits/stdc++.h>
using namespace std;
int len1,len2;
int next[1000005];
char s[1000005],t[1000005];
void next_find()
{
    int j,k;
    j=0;
    k=-1;
    next[0]=-1;
    while(j<len2)
    {
        if(k==-1||t[j]==t[k])
        {
            j++;
            k++;
            next[j]=k;
        }
        else
        {
            k=next[k];
        }

    }
}
void kmp()
{
    int j=0,i=0;
    
    while(i<len1&&j<len2)
    {
        if(j==-1||s[i]==t[j])
        {
            i++;
            j++;
        }
        else
        {
            j=next[j];
        }
        if(j==len2)
        {
            printf("%d\n",i-len2+1);
            j=next[j];
        }
    }
}
int main()
{
        scanf("%s",s);
        scanf("%s",t);
        len1=strlen(s);
        len2=strlen(t);
        next_find();
        kmp();
        for(int i=1; i<=len2; i++)
        {
            printf("%d ",next[i]);
        }
        return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章