Cod sursa(job #1312969)

Utilizator diana97Diana Ghinea diana97 Data 10 ianuarie 2015 11:00:33
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>

using namespace std;

ifstream f ("strmatch.in");
ofstream g ("strmatch.out");

const int LMAX = 2000000 + 1;

char sir[LMAX], pattern[LMAX];
int p[LMAX];
vector <int> sol;

void citeste() {
    f >> pattern >> sir;
}

void prefix(char *s) {
    int l = strlen(s), k = 0;
    p[0] = 0;
    for (int i = 1; i < l; i++) {
            while (k > 0 && s[k] != s[i]) k = p[k - 1];
            if (s[k] == s[i]) k++;
            p[i] = k;
    }
}

int KMP(char *a, char *b) {
    prefix(a);
    int n = strlen(a);
    int m = strlen(b);
    int k = 0, aparitii = 0;
    for (int i = 0; i < m; i++) {
        while (k > 0 && a[k] != b[i]) k = p[k - 1];
        if (a[k] == b[i]) k++;
        if (k == n) {
            aparitii++;
            if (aparitii <= 1000) sol.push_back(i - n + 1);
        }
    }
    return aparitii;
}

void scrie() {
    for (int i = 0; i < (int)sol.size(); i++) g << sol[i] << ' ';
    g << '\n';
}

int main() {
    citeste();
    g << KMP(pattern, sir) << '\n';
    scrie();
}