Cod sursa(job #1364262)

Utilizator httpsLup Vasile https Data 27 februarie 2015 16:20:18
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <bits/stdc++.h>
using namespace std;

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

#define cout g
#define nmax 2000002
#define BASE 75
#define MOD1 999983
#define MOD2 999981

char pattern[nmax],text[nmax];
int pref[nmax],k,pos;
int n,m,i;
vector <int> sol;

void make_prefix()
{
    pref[1]=0;
    for(i=2;i<=n;++i)
    {
        for(k=pref[i-1];pattern[k+1]!=pattern[i] && k!=0;k=pref[k]);
        if(pattern[k+1]==pattern[i]) pref[i]=k+1;
    }
}

int main()
    {
    f>>(pattern+1);
    f>>(text+1);
    n=strlen(pattern+1);
    m=strlen(text+1);

    if(n>m)
        {
        cout<<"0";
        return 0;
        }
    make_prefix();
    for(pos=0,i=1;i<=m;++i)
    {
        while(pattern[pos+1]!=text[i] && pos!=0) pos=pref[pos];
        if(pattern[pos+1]==text[i]) ++pos;
        if(pos==n)
            sol.push_back(i-n),pos=pref[pos];
    }

    cout<<sol.size()<<'\n';
    for(i=0; i<min((int)sol.size(),1000); ++i) cout<<sol[i]<<' ';
    }