Cod sursa(job #1332766)

Utilizator gabib97Gabriel Boroghina gabib97 Data 2 februarie 2015 13:42:34
Problema Potrivirea sirurilor Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>
#include <string.h>
using namespace std;
ifstream fin ("strmatch.in");
ofstream fout ("strmatch.out");
int n,m,i,urm[2000005],d[2000001],t;
char T[2000005],P[2000005];
void prefix()
{
    int i,k=0;
    urm[1]=0;
    for (i=2;i<=m;i++)
    {
        while (k>0&&P[k+1]!=P[i]) k=urm[k];
        if (P[k+1]==P[i]) k++;
        urm[i]=k;
    }
}
void kmp()
{
    int i,k=0;
    for (i=0;i<=n;i++)
    {
        while (k>0&&P[k+1]!=T[i]) k=urm[k];
        if (P[k+1]==T[i]) k++;
        if (k==m)
        {
            d[++t]=i-m+1;
            k=urm[k];
        }
    }
}
int main()
{
    fin.getline(P+1,2000004);
    fin.getline(T+1,2000004);
    n=strlen(T+1);
    m=strlen(P+1);
    prefix();
    kmp();
    fout<<t<<'\n';
    for (i=1;i<=min(1000,t);i++) fout<<d[i]<<" ";
    fin.close();
    fout.close();
    return 0;
}