Pagini recente » Cod sursa (job #555069) | Cod sursa (job #193477) | Cod sursa (job #1031433) | Cod sursa (job #791940) | Cod sursa (job #1528220)
#include<stdio.h>
#include <ostream>
FILE *fin,*fout;
char s1[2000002],s2[2000002];
int p[2000001],l1,l2;
int res[2000001],pos;
int main()
{
fin=fopen("strmatch.in","r");
fout=fopen("strmatch.out","w");
s1[0]='K';
for(l1=1;s1[l1-1]>='A'&&s1[l1-1]<='Z';l1++)
{
fscanf(fin,"%c",&s1[l1]);
}
l1--;
l2=1;
while(!feof(fin))
{
fscanf(fin,"%c",&s2[l2]);
l2++;
}
l2--;
int k=0;
for(int i=2;i<l1;i++)
{
while(k>0&&s1[k+1]!=s1[i])
{
k=p[k];
}
if(s1[k+1]==s1[i])
{
k++;
}
p[i]=k;
}
k=0;
for(int i=1;i<l2;i++)
{
while(s2[i]!=s1[k+1]&&k>0)
{
k=p[k];
}
if(s2[i]==s1[k+1])
{
k++;
}
if(k==l1-1)
{
pos++;
res[pos]=i-k;
//fprintf(fout,"%d %d\n\n",k,p[k]);
k=p[k];
}
}
fprintf(fout,"%d\n",pos);
for(int i=1;i<=pos;i++)
{
fprintf(fout,"%d ",res[i]);
}
}