Cod sursa(job #492255)

Utilizator MariusMarius Stroe Marius Data 13 octombrie 2010 22:12:50
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>

using namespace std;

const char iname[] = "strmatch.in";
const char oname[] = "strmatch.out";

const int MAX_L = 2000005;

char pattern[MAX_L], text[MAX_L];
int pi[MAX_L];

void make_prefix(const char pattern[], int pi[])
{
    int length = strlen(pattern + 1);
    int k = pi[1] = 0;

    for (int i = 2; i <= length; ++ i) {
        while (k && pattern[k + 1] != pattern[i])
            k = pi[k];
        if (pattern[k + 1] == pattern[i])
            k ++;
        pi[i] = k;
    }
}

int main()
{
    vector <int> output;

    ifstream in(iname);
    in >> (pattern + 1) >> (text + 1);
    in.close();

    make_prefix(pattern, pi);

    int text_length = strlen(text + 1);
    int pattern_length = strlen(pattern + 1);
    int k = 0;
    for (int i = 1; i <= text_length; ++ i) {
        while (k && pattern[k + 1] != text[i])
            k = pi[k];
        if (pattern[k + 1] == text[i])
            k ++;
        if (k == pattern_length) {
            k = pi[k];
            output.push_back(i - pattern_length);
        }
    }

    ofstream out(oname);
    out << output.size() << "\n";
    for (size_t i = 0; i < min(output.size(), (size_t) 1000); ++ i)
        out << output[i] << " ";
    out.close();

    return 0;
}