Cod sursa(job #2284614)

Utilizator AntoniuFicAntoniu Ficard AntoniuFic Data 17 noiembrie 2018 11:57:31
Problema Potrivirea sirurilor Scor 14
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#include <string.h>

using namespace std;

char a[2000001], b[200001];
int la, lb;

int ha1, ha2, put1, put2;

char match[2000001];

int main()
{
	ifstream f("strmatch.in");
	ofstream g("strmatch.out");
	f.getline(a, 2000000);
	f.getline(b, 2000000);
	la=strlen(a);
	lb=strlen(b);
	put1=put2 = 1;
	ha1=ha2 = 0;
	for(int i=0; i<la; i++)
	{
		ha1=(ha1*73+a[i])%100007;
		ha2=(ha2*73+a[i])%100021;
		if(i!=0)
			put1=(put1*73)%100007, put2=(put2*73)%100021;
	}
	if(la>lb)
	{
		g<<0<<endl;
		return 0;
	}
	int h1=0, h2=0;
	for(int i=0; i<la; i++)
		h1=(h1*73+b[i])%100007, h2=(h2*73+b[i])%100021;
	int nr=0;
	if(h1==ha1&&h2==ha2)
		match[0]=1, nr++;
	for(int i=la; i<lb; i++)
	{
		h1=((h1-(b[i-la]*put1)%100007+100007)*73+b[i])%100007;
		h2=((h2-(b[i-la]*put2)%100021+100021)*73+b[i])%100021;
		if (h1==ha1&&h2==ha2)
			match[i-la+1]=1, nr++;
	}
	g<<nr;
	for(int i=0; i<lb&&nr<1000; i++)
		if (match[i])
        {
            g<<i+1<<' ';
        }
	return 0;
}