Cod sursa(job #1880609)

Utilizator savigunFeleaga Dragos-George savigun Data 15 februarie 2017 20:39:31
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <string.h>
using namespace std;
typedef int uint;

uint n, lt, lp;
char text[2000001], pattern[2000001];
uint prefix[2000001];
uint pos[1001];

int main() {
    ifstream in("strmatch.in");
    ofstream out("strmatch.out");

    in.getline(pattern, 2000001);
    in.getline(text, 2000001);

    lp = strlen(pattern);
    lt = strlen(text);

    //preprocess();
    uint j = 0;
    prefix[0] = 0;

    for (uint i = 1; i < lp; ++i) {
        while (j > 0 && pattern[i] != pattern[j]) {
            j = prefix[j - 1];
        }

        if (pattern[i] == pattern[j]) {
            ++j;
        }

        prefix[i] = j;
    }

    //KMP();
    j = 0;
    for (uint i = 0; i < lt; ++i) {
        while (j > 0 && text[i] != pattern[j]) {
            j = prefix[j - 1];
        }

        if (text[i] == pattern[j]) {
            ++j;
            if (j == lp) {
                if (++n <= 1000) pos[n] = i - lp + 1;
                j = prefix[j - 1];
            }
        }
    }

    //output();
    out << n << '\n';

    uint mini = (n < 1000) ? n : 1000;
    for (uint i = 1; i <= mini; ++i)
        out << pos[i] << ' ';

    return 0;
}