Pagini recente » Istoria paginii runda/minus/clasament | Cod sursa (job #434429) | Cod sursa (job #1637108) | Cod sursa (job #1650930) | Cod sursa (job #170060)
Cod sursa(job #170060)
#include<stdio.h>
#include<alloc.h>
#include<string.h>
char *a,*b;
int *pi;
int sol[1001],count=0;
void citeste()
{
freopen("strmatch.in","r",stdin);
scanf("%s\n%s",a+1,b+1);
fclose(stdin);
}
void scrie()
{
freopen("strmatch.out","w",stdout);
for(int i=0;i<count;i++) printf("%d ",sol[i]);
fclose(stdout);
}
void rezolva()
{ int i;
int n=strlen(a),m=strlen(b);
int k=0;
pi=(int*)malloc((n+1)*sizeof(int));
pi[1]=0;
for(i=2;i<=n;i++)
{ while(k&&a[i]!=a[k+1]) k=pi[k];
if(a[k+1]==a[i]) k++;
pi[i]=k;
}
k=0;
for(i=1;i<=m;i++)
{ while(k&&b[i]!=a[k+1]) k=pi[k];
if(a[k+1]==b[i]) k++;
if(k==n)
{ count++;
if(count<=1000) sol[count]=i-n-1;
}
}
free(pi);
}
int main()
{
citeste();
rezolva();
scrie();
return 0;
}