Cod sursa(job #1741156)

Utilizator razvandRazvan Dumitru razvand Data 13 august 2016 02:06:01
Problema Aho-Corasick Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in("ahocorasick.in");
ofstream out("ahocorasick.out");

int Z[2*2000003];

int ZF(string s1, string s2) {

    int left = 0;
    int right = 0;
    string s = s1 + "$" + s2;
    int am = 0;

    for(int i = 0; i < s.size(); i++) {
        Z[i] = 0;
    }

    for(int k = 0; k < s.size(); k++) {

        if(k > right) {
            left = k;
            right = k;
            while(right < s.size() && s[right] == s[right-left])
                right++;
            Z[k] = right-left;
            right--;
        } else {

            int p = k+Z[k-left];

            if(p <= right)
                Z[k] = Z[p];
            else {
                left = k;
                while(right < s.size() && s[right] == s[right-left])
                    right++;
                Z[k] = right-left;
                right--;
            }

        }

        am += (Z[k]==s1.size());

    }

    return am;

}

int main() {

    string s1;
    string s2;
    in >> s1;
    int n;
    in >> n;

    for(int i = 1; i <= n; i++) {
        in >> s2;
        out << ZF(s2, s1) << '\n';
    }

    return 0;
}