Cod sursa(job #2145083)

Utilizator andrei32576Andrei Florea andrei32576 Data 27 februarie 2018 08:36:24
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<bits/stdc++.h>
using namespace std;

int n,m,nr,i,q,pi[2000005],pos[1024];
char a[2000005],b[2000005];

ifstream fin("strmatch.in");
ofstream fout("strmatch.out");

void prefix()
{
    int i,q=0;
    pi[1]=0;
    for(i=2;i<=n;i++)
    {
        while(q>0 && a[q+1]!=a[i])
            q=pi[q];
        if(a[q+1]==a[i])
            q++;
        pi[i]=q;
    }
}

int main()
{
    fin.getline(a,2000002);
    fin.getline(b,2000002);
    n=strlen(a);
    m=strlen(b);

    for(i=n;i>=1;i--) a[i]=a[i-1];
    for(i=m;i>=1;i--) b[i]=b[i-1];
    a[0]=' ';
    b[0]=' ';

    prefix();

    for(i=1;i<=m;i++)
    {
        while(q>0 && a[q+1]!=b[i])
            q=pi[q];
        if(a[q+1]==b[i])
            q++;
        if(q==n)
        {
            q=pi[n];
            nr++;
            if(nr<=1000) pos[nr]=i-n;
        }
    }

    fout<<nr<<"\n";
    for(i=1;i<=min(nr,1000);i++)
        fout<<pos[i]<<" ";

    fin.close();
    fout.close();
    return 0;
}