Cod sursa(job #2334673)

Utilizator IOI_MDA_003Sebastian Chicu IOI_MDA_003 Data 2 februarie 2019 21:09:32
Problema Potrivirea sirurilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <string.h>

using namespace std;

ifstream fin ("strmatch.in");
ofstream fout("strmatch.out");

const int N_MAX = 2000000 + 5;

char P[N_MAX], T[N_MAX];
int key[N_MAX];
vector<int> ans;

void makeKey(){
    int k = 0, m = strlen(P+1);
    for(int i = 2; i<=m; ++i){
        while(k && P[i] != P[k+1])
            k = key[k];
        if(P[i] == P[k+1])
            k++;
        key[i] = k;
    }
}

void kmp(){
    int k = 0, n = strlen(T+1), m = strlen(P+1);
    for(int i = 1; i <=n; ++i){
        while(k && T[i] != P[k+1])
            k = key[k];
        if(T[i] == P[k+1])
            k++;
        if(k == m){
            ans.push_back(i-m);
            k = key[k];
        }
    }
}

int main(){
    fin >> (P+1);
    fin >> (T+1);

    makeKey();
    kmp();
    
    for(int i = 0; i < ans.size(); ++i, fout << " ")
        fout << ans[i];

    return 0;
}
// român convertit la moldovenism