Cod sursa(job #1426044)

Utilizator DenisacheDenis Ehorovici Denisache Data 28 aprilie 2015 20:57:27
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <conio.h>
#define pb push_back
#define mp make_pair
#define MOD 1000000007
#define newl printf("\n")
using namespace std;
int n,m,pi[2000005];
char a[2000005],b[2000005];
vector <int> sol;
void make_prefix()
{
    pi[1]=0;
    int k=0;
    for (int i=2;i<=n;i++)
    {
        while (k>0 && a[i]!=a[k+1]) k=pi[k];
        if (a[i]==a[k+1]) k++;
        pi[i]=k;
    }
}
int main()
{
    freopen("strmatch.in","r",stdin);
    freopen("strmatch.out","w",stdout);
    gets(a+1); n=strlen(a+1);
    gets(b+1); m=strlen(b+1);
    make_prefix();
    int k=0;
    for (int i=1;i<=m;i++)
    {
        while (k>0 && b[i]!=a[k+1]) k=pi[k];
        if (b[i]==a[k+1]) k++;
        if (k==n)
        {
            if (sol.size()<1000) sol.pb(i-n);
            k=pi[k];
        }
    }
    printf("%d\n",sol.size());
    for (int i=0;i<sol.size();i++)
        printf("%d ",sol[i]);
    return 0;
}