Cod sursa(job #395701)

Utilizator GotenAmza Catalin Goten Data 13 februarie 2010 17:32:46
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
/*#include<fstream.h>
int pre[2000100],c[1100];
char a[2000100],b[2000100];
int main()
{
	int A,B,i,k=-1,ok=1;
	ifstream f("strmatch.in");
	ofstream g("strmatch.out");
	f.getline(a,2000100);
	f.getline(b,2000100);
	A=strlen(a)-1;
	B=strlen(b)-1;
	pre[0]=-1;
	for(i=1;i<=A;i++)
	{
		while(k>=0&&a[k+1]!=a[i])
			k=pre[k];
		if(a[k+1]==a[i])
			k++;
		pre[i]=k;
	}
	k=-1;
	for(i=0;i<=B;i++)
	{
		while(k>=0&&a[k+1]!=b[i])
			k=pre[k];
		if(a[k+1]==b[i])
			k++;
		if(k==A)
		{
			if(ok)
				c[++c[0]]=i-A;
			else
				c[0]++;
			if(c[0]==1000)
				ok=0;
		}
	}
	g<<c[0]<<'\n';
	for(i=1;i<=c[0]&&i<=1000;i++)
		g<<c[i]<<' ';
	return 0;
}
*/
#include<fstream.h>
char a[2000100],b[2000100];
int c[1100];
int main()
{
	int ah1=0,ah2=0,bh1=0,bh2=0,A,B,i,p=97,q=100007,w=100021,pq=1,pw=1,d,ok=1;
	ifstream f("strmatch.in");
	ofstream g("strmatch.out");
	f.getline(a,2000100);
	f.getline(b,2000100);
	A=strlen(a);
	B=strlen(b);
	for(i=0;i<A;i++)
	{
		ah1=(ah1*p+a[i])%q;
		ah2=(ah2*p+a[i])%w;
		bh1=(bh1*p+b[i])%q;
		bh2=(bh2*p+b[i])%w;
		if(i)
		{
			pq=pq*p%q;
			pw=pw*p%w;
		}
	}
	if(ah1==bh1&&ah2==bh2)
		c[++c[0]]=0;
	for(i=A;i<=B;i++)
	{
		d=b[i-A];
		d*=pq;
		d%=q;
		bh1=((bh1-d+q)*p+b[i])%q;
		d=b[i-A];
		d*=pw;
		d%=w;
		bh2=((bh2-d+w)*p+b[i])%w;
		if(ah1==bh1&&ah2==bh2)
		{
			if(ok)
				c[++c[0]]=i-A+1;
			else
				c[0]++;
			if(c[0]==1000)
				ok=0;
		}
	}
	g<<c[0]<<'\n';
	for(i=1;i<=1000&&i<=c[0];i++)
		g<<c[i]<<' ';
	return 0;
}