Cod sursa(job #856321)

Utilizator toranagahVlad Badelita toranagah Data 16 ianuarie 2013 11:45:03
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <algorithm>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

const int MAX_N = 2000100;

string text;
string pattern;
int prefix[MAX_N];
vector<int> matches;

void read(), solve(), print();
void compute_prefix(const string pattern); 
void find_match(const string text, const string pattern); 


int main() {
    read();
    solve();
    print();
    return 0;
}

void read() {
    ifstream fin("strmatch.in");
    getline(fin, pattern);
    getline(fin, text);
    pattern = ' ' + pattern;
    text = ' ' + text;
}

void solve() {
    compute_prefix(pattern);
    find_match(text, pattern);
}

void compute_prefix(const string pattern) {
    int N = pattern.size() - 1;
    prefix[1] = 0;
    int p = 0;
    for (int i = 2; i <= N; ++i) {
        while (p > 0 && pattern[p+1] != pattern[i]) p = prefix[p];
        if (pattern[p+1] == pattern[i]) ++p;
        prefix[i] = p;
    }
}

void find_match(const string text, const string pattern) {
    int N = text.size() - 1;
    int M = pattern.size() - 1;
    int p = 0;
    for (int i = 1; i <= N; ++i) {
        while (p > 0 && pattern[p+1] != text[i]) p = prefix[p];
        if (pattern[p+1] == text[i]) ++p;
        if (p == M) {
            matches.push_back(i - M);
            p = prefix[p];
        }
    }
}

void print() {
    ofstream fout("strmatch.out");
    fout << matches.size() << '\n';
    for (unsigned int i = 0; i < matches.size() && i < 1000; ++i) {
        fout << matches[i] << ' ';
    }
}