Cod sursa(job #1408505)

Utilizator ZenusTudor Costin Razvan Zenus Data 30 martie 2015 06:42:00
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <fstream>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;

#define NMAX 2000007

int pi[NMAX];
string str,pat;
int i;
vector < int > sol;

void bpi(string pat)
{
    int k=0,i;

    for (i=1;i<pat.size();++i)
    {
        for (;k && pat[k] != pat[i] ; k = pi[k-1]);
        k += (pat[k] == pat[i]);
        pi[i] = k;
    }
}

vector < int > KMP(string str,string pat)
{
    bpi(pat);
    vector < int > ans;
    int k=0,i;

    for (i=0;i<str.size();++i)
    {
        for (;k && pat[k] != str[i];k = pi[k-1]);
        k += (pat[k] == str[i]);
        if (k==pat.size()) ans.push_back(i-pat.size()+1);
    }
    return ans;
}

int main()
{
ifstream f("strmatch.in");
ofstream g("strmatch.out");

f >> pat >> str;

sol = KMP(str,pat);

g << sol.size() << '\n';

for (i=0;i<min((int)sol.size(),1000);++i)
g << sol[i] << " ";
g << '\n';

return 0;
}