Cod sursa(job #609766)

Utilizator alinhAlin H alinh Data 23 august 2011 11:06:42
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <cstring>
#include <vector>

using namespace std;

#define MAX 2000001

ifstream fi;
ofstream fo;

char a[MAX];
char b[MAX];
int lena;
int lenb;

int k;
int q;

int pi[MAX];

vector<int> sol;

int main()
{
    // citire
    fi.open("strmatch.in");
    fi >> a;
    fi >> b;
    fi.close();
    lena = strlen(a);
    lenb = strlen(b);

    // prefix
    k = 0;
    pi[1] = 0;
    for (int i=2; i<=lena; ++i)
    {
        while ((k > 0) && (a[k] != a[i-1]))
            k = pi[k];
        if (a[k] == a[i-1])
            ++k;
        pi[i] = k;
    }

    // kmp
    k = 0;
    q = 0;
    for (int i=1; i<=lenb; ++i)
    {
        while ((q>0) && (a[q] != b[i-1]))
            q = pi[q];
        if (a[q] == b[i-1])
            ++q;
        if (q == lena)
        {
            sol.push_back(i - lena);
            ++k;
            q = pi[q];
        }
    }

    // tiparire
    fo.open("strmatch.out");
    fo << k << "\n";
    vector<int>::iterator it;
    q = 0;
    for (it = sol.begin(); it != sol.end(); ++it)
    {
        fo << *it << " ";
        ++q;
        if (q==1000)
            break;
    }
    fo.close();
    return 0;
}