Cod sursa(job #2009594)

Utilizator moise_alexandruMoise Alexandru moise_alexandru Data 10 august 2017 03:52:45
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
const int maxn = 2000005;
vector <int> sol;
string a, b;
int Z[maxn];
int st, dr;
int n;

void parcurgere(int i)
{
    st = i;
    while(dr < n && b[dr - st] == b[dr])
        dr++;
    Z[i] = dr - st;
    dr--;
}

int main()
{
    in >> a >> b;
    b = a + "#" + b;
    n = b.size();
    Z[0] = b.size();
    for(int i = 1; i < n; i++)
    {
        if(i > dr)
        {
            dr = i;
            parcurgere(i);
        }
        else
        {
            int k = i - st;
            if(Z[k] < dr - i + 1)
                Z[i] = Z[k];
            else
                parcurgere(i);
        }
    }
    for(int i = 1; i < n; i++)
        if(Z[i] >= a.size())
            sol.push_back(i);
    for(unsigned int i = 0; i < min(999U, sol.size()); i++)
        out << sol[i] - a.size() - 1 << " ";
    out << "\n";
    return 0;
}