Cod sursa(job #2365320)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 4 martie 2019 12:56:22
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include<bits/stdc++.h>
using namespace std;

const int maxN=2000005;

vector<int> matches;
char P[maxN],S[maxN];
int pref[maxN];
int main()
{
    freopen("strmatch.in","r",stdin);
    freopen("strmatch.out","w",stdout);


    scanf("%s",P+1);
    scanf("\n");
    scanf("%s",S+1);

    int n=strlen(P+1);
    int m=strlen(S+1);

    int k=0;
    pref[1]=0;
    for(int i=2;i<=n;i++)
    {
        while(k>0 && P[k+1]!=P[i]) k=pref[k];
        if(P[k+1]==P[i]) k++;
        pref[i]=k;
    }

    k=0;
    int sz=0;
    for(int i=1;i<=m;i++)
    {
        while(k>0 && P[k+1]!=S[i]) k=pref[k];
        if(P[k+1]==S[i]) k++;
        if(k==n && (int)matches.size()<1000) matches.push_back(i-n),sz++;
            else
        if(k==n) sz++;
    }

    //sort(matches.begin(),matches.end());
    printf("%d\n",sz); //dumbest problem

    for(auto it:matches) printf("%d ",it);
    printf("\n");
    return 0;
}