Cod sursa(job #1550157)

Utilizator alin1999Buzatu Alin alin1999 Data 13 decembrie 2015 12:39:46
Problema Potrivirea sirurilor Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <string.h>
#define d 67
#define m1 100007
#define m2 100021
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
char sir1[2000001],sir2[2000001];
int m,n;
char v[2000001];
int main()
{
    int i,a1,a2,p1,p2,Max=2000001;
    fin.getline(sir1,2000001);
    fin.getline(sir2,2000001);
    m=strlen(sir1);
    n=strlen(sir2);
    a1=a2=0;
    p1=p2=0;
    for (i=0;i<m;i++)
    {
        a1=(a1*d+sir1[i])%m1;
        a2=(a2*d+sir1[i])%m2;
        if (i!=0)
            p1=(p1*d)%m1,
            p2=(p2*d)%m2;
    }
    if (m>n)
    {
        fout<<0;
        return 0;
    }

    int b1=0,b2=0;
    for (i=0;i<m;i++)
        b1=(b1*d+sir2[i])%m1,
        b2=(b2*d+sir2[i])%m2;

    int Nr=0;
    if (a1==b1&&a2==b2)
        v[0]=1,Nr++;

    for (i=m;i<n;i++)
    {
        b1=((b1-(sir2[i-m]*p1)%m1+m1)*d+sir2[i])%m1;
        b2=((b2-(sir2[i-m]*p2)%m2+m2)*d+sir2[i])%m2;

        if (b1==a1&&b2==a2)
            v[i-m+1]=1,Nr++;
    }
    fout<<Nr;
    Nr=0;
    for (i=0;i<n&&Nr<1000;i++)
        if (v[i])
            Nr++,
            fout<<i;
    fout<<'\n';

    return 0;
}