Cod sursa(job #777369)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 12 august 2012 04:47:28
Problema Potrivirea sirurilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
const char infile[] = "strmatch.in";
const char outfile[] = "strmatch.out";

#define NMAX 2000001

int occurences;
int fail[NMAX];
int pos[1001];
int curPos;
char pattern[NMAX];
char toMatch[NMAX];
int N;

void computeFail()
{
    for(int i = 1; i < N; i++)
    {
        if(pattern[fail[i-1]] == pattern[i])
        {
            fail[i] = fail[i-1] + 1;
        }
    }
}

void computeMatches()
{
    int current = 0;
    unsigned int len = strlen(toMatch);

    for(unsigned int i = 0; i < len; i++)
    {
        while(pattern[current] != toMatch[i] && current != 0 )
        {
            current = fail[current - 1];
        }

        if(pattern[current] == toMatch[i])
        {
            current++;
            if(current == N)
            {
                if(curPos < 1000)
                    pos[curPos++] = i - N + 1;
                occurences++;
                current = fail[current - 1];
            }
        }
    }
}

int main(int argc, char* argv[])
{
	fstream fin(infile, ios::in);
	fstream fout(outfile, ios::out);

    fin.getline(pattern, NMAX);
    fin.getline(toMatch, NMAX);

    N = strlen(pattern);
    computeFail();
    computeMatches();

    fout << occurences << "\n";

    for(int i = 0; i < 1000 && i < curPos; i++)
    {
        fout << pos[i] << " ";
    }
    fout << "\n";

	fin.close();
	fout.close();
	return 0;
}