Cod sursa(job #751931)

Utilizator BitOneSAlexandru BitOne Data 27 mai 2012 14:26:19
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <vector>
#include <string>
#include <fstream>
#include <cstdlib>
#include <iterator>
#include <algorithm>

using namespace std;

const int N_MAX=2000011;

string pattern, s;
vector<int> match;
int FailureFunction[N_MAX];

int main()
{
    int patternSize, sSize, i, j, countMatch;
    ifstream in("strmatch.in");
    ofstream out("strmatch.out");

    getline(in, pattern);
    getline(in, s);
    patternSize=pattern.size();
    sSize=s.size();

    for(i=2, j=0; i <= patternSize; ++i)
    {
        for(; pattern[i-1] != pattern[j] && j; j=FailureFunction[j]);
        if(pattern[i-1] == pattern[j])
            ++j;
        FailureFunction[i]=j;
    }
    pattern.push_back(' '); s.push_back(' ');
    for(i=j=countMatch=0; i < sSize; )
    {
        if(pattern[j] == s[i])
        {
            ++i, ++j;
            if(patternSize == j)
            {
                ++countMatch;
                if(1000 >= countMatch)
                    match.push_back(i-patternSize);
            }
        }
        else if(j)
                j=FailureFunction[j];
             else ++i;
    }
    out<<countMatch<<"\n";
    copy(match.begin(), match.end(), ostream_iterator<int>(out, " "));
    return EXIT_SUCCESS;
}