Cod sursa(job #1524091)

Utilizator kiunyAndrei Gavrila kiuny Data 13 noiembrie 2015 15:56:22
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;

string pat, s;
vector <int> p;
int l, n;
void prefix()
{

    int k = -1;
    p[0] = k;
    int i = 0;
    while(i < l)
    {
        while(k >= 0 && pat[i] != pat[k]) k = p[k];
        k++;
        i++;
        p[i] = k;
    }
}

vector <int> matches;

void getMatches()
{
    int j = 0;
    int i = 0;
    while(i < n)
    {
        while( j >= 0 && s[i] != pat[j])
        {

            j = p[j];
            //cout << j << ' ' <<p[j] << endl;

        }
        j++;
        i++;
        //cout <<  "j = " << j << '\n';
        if( j == l)
        {
            //cout << 'a';
            matches.push_back(i-j);
            j = p[j];
        }
    }
}

int main()
{
    cin >> pat;
    cin >> s;
    l = pat.length();
    n = s.length();
    p.resize(l+1, 0);
    prefix();
    getMatches();
    for(auto i : matches)
    {
        cout << i << ' ';
    }
}