Fork me on 
Catalogue

我自问酒不问仙,半世逍遥半世癫,我自问心不问佛,半世情愁半世痴。 ​​​​

汉孤臣のKMP模板(找所有的出现过模式串的下标)

模板题 http://private.vjudge.net/problem/EOlymp-1498

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <deque>
#include <map>
using namespace std;
const int maxn=100000+50;
int n,m,ans,nextt[maxn];
string ch1,ch2;
void kmp()
{
    int i=0,j=-1; ans=-1; nextt[0]=-1;
    while (i<ch2.size())
        if (j==-1 || ch2[i]==ch2[j]) nextt[++i]=++j;
        else j=nextt[j];
    i=0; j=0;
    while (i<ch1.size())
    {
        if (j==-1 || ch1[i]==ch2[j]) ++i,++j;
        else j=nextt[j];
        if (j==ch2.size())
        {
            if (ans!=-1) printf(" ");
            ans=i-j; j=nextt[j];
            printf("%d",ans);
        }
    }
    printf("\n");
}
int main()
{
    cin>>ch1>>ch2;
    kmp();
    return 0;
}

 

posted @ 2021-03-07 20:19  汉孤臣  阅读(57)  评论(0)    收藏  举报
Live2D