Cod sursa(job #1295675)

Utilizator LycrsTrifan Tamara Lycrs Data 19 decembrie 2014 23:21:32
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <fstream>
#include <string>
using namespace std;
ifstream cin("strmatch.in");
ofstream cout("strmatch.out");

int n, i, m, j, prefix[2000005], a, k, f=0;
string s, p, pp;

int main()
{
    cin>>p;
    cin>>s;

    m=p.size();
    n=s.size();

    p='%'+p;
    s='%'+s;

    a=0;
    prefix[1]=0;
    for(j=2; j<=m; ++j)
    {
        while(a>0 && p[a+1]!=p[j]) a=prefix[a];

        if (p[a+1]==p[j]) ++a;

        prefix[j]=a;
    }


    i=1; k=1; j=1;

    while ( n-k >= m-1 )
    {

        while (j<=m && s[i]==p[j])
        {
            ++i;
            ++j;
        }

        if (j>m)
        {
            cout<<k-1<<' ';
            ++f;

            k=i;
            if (prefix[j-1]>0) k=i-prefix[j-1];
            if (f==1000) n=0;

        }
        else
        {
            if (i==k) ++i;
            k=i;

        }
        if (j>1) j=prefix[j-1]+1;

    }



    return 0;
}