Cod sursa(job #978901)

Utilizator costyrazvyTudor Costin Razvan costyrazvy Data 30 iulie 2013 12:32:16
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include <cstring>
#define mod1 666013
#define mod2 10003
using namespace std;
int na,nb,i,sol[2000001],val1,val2,txt1,txt2,baza1,baza2,ind;
char a[2000001],b[2000001];
int main()
{
    ifstream f("strmatch.in");
    ofstream g("strmatch.out");
    f.get(a,2000001);
    f.get();
    f.get(b,2000001);
    f.get();
    na=strlen(a);int x=0;
    nb=strlen(b);baza1=1;baza2=1;
    for (i=0;i<na;i++)
    {
        val1=(val1*101%mod1+b[i])%mod1;
        val2=(val2*109%mod2+b[i])%mod2;
        txt1=(txt1*101%mod1+a[i])%mod1;
        txt2=(txt2*109%mod2+a[i])%mod2;
        if(i!=0)
        {
            baza1=(baza1*101)%mod1;
            baza2=(baza2*109)%mod2;
        }
    } ind=0;
    if (txt1==val1 && txt2==val2) sol[++ind]=0,x++;
    for (i=na;i<nb;i++)
    {
           val1 =  ( (val1 - (b[ i - na]*baza1)% mod1 + mod1)*101 + b[i])%mod1;
           val2 =  ( (val2 - (b[ i - na]*baza2)% mod2 + mod2)*109 + b[i])%mod2;
            if (val1==txt1 && val2==txt2)
            sol[++ind]=i-na+1,x++;
    }
    g<<x<<'\n';
    for (i=1;i<=min(1000,ind);i++)  g<<sol[i]<<" ";
    f.close();
    g.close();
    return 0;
}