Pagini recente » Cod sursa (job #1494883) | Cod sursa (job #2068436) | Cod sursa (job #2363360) | Cod sursa (job #972847) | Cod sursa (job #236558)
Cod sursa(job #236558)
#include<stdio.h>
#include<string.h>
#define NMAX 2000
char a[NMAX],b[NMAX];
int n,m,lung=0;
int sol[1001];
long baza[NMAX],hasha=0,hashb=0;
int compara(int j)
{
int i;
for(i=0;i<m;i++)
if(a[i]!=b[j+i])
return 0;
return 1;
}
void RK()
{
int i;
baza[0]=1;
for(i=1;i<=m;i++)
baza[i]=(baza[i-1]*32)%19999973;
hasha=hashb=0;
for(i=0;i<m;i++)
{
hasha=(hasha+(a[i]-'a')*baza[m-i-1])%19999973;
hashb=(hashb+(b[i]-'a')*baza[m-i-1])%19999973;
}
if(hasha==hashb&&compara(0))sol[++lung]=0;
for(i=1;i<n-m+1;i++)
{
hashb=(hashb-((b[i-1]-'a')*baza[m-1])%19999973)%19999973;
hashb=(hashb*32+b[i+m-1]-'a')%19999973;
if(hasha==hashb&&compara(i))
if((n<1000)||(n>1000&&lung<1000))
sol[++lung]=i;
else return ;
}
for(i=1;i<=lung;i++)
printf("%d ", sol[i]);
}
int main()
{
int i;
freopen("strmatch.in","r",stdin);
freopen("strmatch.out","w",stdout);
scanf("%s\n",a);
scanf("%s",b);
m=strlen(a);
n=strlen(b);
for(i=0;i<m;i++)
if(a[i]>='A'&&a[i]<='Z')
a[i]=a[i]-'A'+'a';
for(i=0;i<n;i++)
if(b[i]>='A'&&b[i]<='Z')
b[i]=b[i]-'A'+'a';
RK();
return 0;
}