Cod sursa(job #2087141)

Utilizator ibogdan25Ilie Ionut ibogdan25 Data 12 decembrie 2017 23:27:25
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("strmatch.in");
ofstream g("strmatch.out");
int countMatch = 0;
vector<int> makePrefix (string pattern) {
    vector<int> F (pattern.length() + 1, 0);
    int j = 0;
    for (int i = 2; i <= pattern.length(); i++) {

        while ((j > 0) && (pattern[j] != pattern[i - 1])) {
            j = F[j];
        }
        if (pattern[j] == pattern[i - 1]) {
            j = j + 1;
        }
        F[i] = j;
    }
    return F;
}
vector<int> kmp(string text, string pattern) {
    vector<int> F = makePrefix(pattern);
    int indexPattern = 0;
    vector<int> solution;
    for (int indexText = 0; indexText < text.length(); indexText++) {
        while ((indexPattern > 0) && (text[indexText] != pattern[indexPattern])) {
            indexPattern = F[indexPattern];
        }
        if (text[indexText] == pattern[indexPattern]) {
            indexPattern++;
        }
        if(indexPattern == pattern.length()) {
            countMatch++;
            if(countMatch <= 1000) {
                solution.push_back(indexText - indexPattern + 1);
            }
            indexPattern = F[indexPattern];
        }
    }
    return solution;
}
int main()
{
    vector <int> preffixMatch = makePrefix("ABABAC");
    for (vector<int>::iterator it = preffixMatch.begin(); it != preffixMatch.end(); it++) {
        cout<<*it<<" ";
    }
    string pattern, text;
    f>>pattern>>text;
    vector <int> solution = kmp(text, pattern);
    g<<countMatch<<"\n";
    for (vector<int>::iterator it = solution.begin(); it != solution.end(); it++) {
        g<<*it<<" ";
    }
    return 0;
}