Cod sursa(job #925445)

Utilizator BitOneSAlexandru BitOne Data 24 martie 2013 15:44:19
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <string>
#include <vector>
#include <fstream>
#include <iterator>
#include <algorithm>

using namespace std;

const int NMAX = 2000011;
const int SOLMAX = 1000;

int fFailure[NMAX];
vector<int> matchIdx;

inline int min(const int& x, const int& y) {return x <= y ? x : y;}

void buildFFailure(string& pattern)
{
    int M, i, j;

    M = pattern.size();
    j = fFailure[0] = fFailure[1] = 0;
    for(i = 2; i <= M; ++i)
    {
        for(; pattern[i - 1] != pattern[j] && j; j = fFailure[j]);
        if(pattern[i - 1] == pattern[j]) ++j;
        fFailure[i] = j;
    }
}

void KMP(string& pattern, string& s)
{
    int N, M, i, j;

    N = s.size();
    M = pattern.size();
    pattern.push_back(' ');
    buildFFailure(pattern);
    for(i = j = 0; i < N; )
    {
        if(s[i] == pattern[j])
        {
            ++j; ++i;
            if(M == j)
            {
                matchIdx.push_back(i - M);
            }
        }
        else if(j)
                j = fFailure[j];
        else ++i;
    }
    pattern.erase(pattern.end() - 1);
}

int main()
{
    string s, pattern;
    ifstream in("strmatch.in");
    ofstream out("strmatch.out");

    getline(in, pattern);
    getline(in, s);
    KMP(pattern, s);
    out << matchIdx.size() << '\n';
    copy(matchIdx.begin(), matchIdx.begin() + min(SOLMAX, matchIdx.size()), ostream_iterator<int>(out, " "));
    out << '\n';

    return EXIT_SUCCESS;
}