Cod sursa(job #1076223)

Utilizator alexsuciuAlex Suciu alexsuciu Data 9 ianuarie 2014 23:10:42
Problema Potrivirea sirurilor Scor 18
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<fstream>
#include<cstring>
#include<iostream>
#define mod1 100007
#define mod2 100021
#define mod3 134531
using namespace std;

char a[2000002],b[2000002];
long n,m,i,v[1001],nr;

long ha1,ha2,hb1,hb2,ha3,hb3;
long h1=1,h2=1,h3=1;

int main()
{
    ifstream f("strmatch.in");
    ofstream g("strmatch.out");
    f>>a;
    f>>b;
    m=strlen(a);
    n=strlen(b);

	for(i=0;i<m;i++)
	{
		ha1=(ha1*73+a[i])%mod1;
		hb1=(hb1*73+b[i])%mod1;
		ha2=(ha2*73+a[i])%mod2;
		hb2=(hb2*73+b[i])%mod2;
		ha3=(ha3*73+a[i])%mod3;
		hb3=(hb3*73+b[i])%mod3;
		if(i)
		{h1=(h1*73)%mod1;
		h2=(h2*73)%mod2;
		h3=(h3*73)%mod3;}
	}

	for(i=0;i<=n-m;i++)
	{
		if(ha1==hb1&&ha2==hb2&&ha3==hb3)
		{
			nr++;
			if(nr<=1000) v[nr]=i;
		}
		hb1=(73*(hb1-(b[i]*h1)%mod1+mod1)+b[i+m])%mod1;
		hb2=(73*(hb2-(b[i]*h2)%mod2+mod2)+b[i+m])%mod2;
		hb3=(73*(hb3-(b[i]*h3)%mod3+mod3)+b[i+m])%mod3;
	}
    g<<nr<<'\n';
    for(i=1;i<=nr && i<=1000;i++)
    g<<v[i]<<'\n';
}