Cod sursa(job #604081)

Utilizator RegeleUmbrelorPopescu Mihai RegeleUmbrelor Data 20 iulie 2011 11:41:56
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
using namespace std;
#include<stdio.h>
#include<string.h>
#include<vector>
const int N=1<<21;
char a[N],b[N];
int prf[N],la,lb;
vector <int> v;

void prekmp()
{
    int k=0;
    prf[1]=0;
    for(int i=2;i<=la;++i)
    {
        while(k>0 && a[k+1]!=a[i])
            k=prf[k];
        if(a[k+1]==a[i])
            k++;
            prf[i]=k;
    }
}

int main()
{
    int i;
    freopen("strmatch.in","r",stdin);
    freopen("strmatch.out","w",stdout);
    scanf("%s",a+1);
    la=strlen(a+1);
    prekmp();
    scanf("%s",b+1);
    lb=strlen(b+1);
    int q=0,nr=0;
    for(i=1;i<=lb;++i)
    {
        while(q>0 && a[q+1]!=b[i])
            q=prf[q];
        if(a[q+1]==b[i])
            q++;
        if(q==la)
        {
            if(++nr<=1000)
            v.push_back(i-la);
        }
    }
    printf("%d\n",nr);
    for(i=0;i<v.size();++i)
    printf("%d ",v[i]);
    return 0;
}