Pagini recente » Cod sursa (job #895468) | Cod sursa (job #1205144) | Cod sursa (job #3189775) | Cod sursa (job #2210787) | Cod sursa (job #395701)
Cod sursa(job #395701)
/*#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;
}