Pagini recente » Cod sursa (job #3179307) | Cod sursa (job #877478) | Cod sursa (job #1420483) | Cod sursa (job #2301274) | Cod sursa (job #1013511)
#include <stdio.h>
#include <vector>
#include <stdlib.h>
#include <string.h>
#define N 2000003
char str[N],pattern[N];
int prev[N];
int main ()
{
int istr,ipattern;
int lstr,lpattern;
std::vector<int> result;
FILE *fin=fopen("strmatch.in","r");
FILE *fout=fopen("strmatch.out","w");
fgets(pattern+1,N,fin);
fgets(str+1,N,fin);
lstr=strlen(str+1)-1;
lpattern=strlen(pattern+1)-1;
int k=0;
for(ipattern=1;ipattern<=lpattern;ipattern++)
{
if(pattern[k+1]==pattern[ipattern+1])
{
prev[ipattern+1]=k+1;
k++;
}
else
{
do
{
k=prev[k];
if(pattern[k+1]==pattern[ipattern+1])
{
prev[ipattern+1]=k+1;
k++;
break;
}
}
while(k!=0);
}
}
ipattern=0;
for(istr=0;istr<=lstr;istr++)
{
// printf("%d %d\n",istr,ipattern);
if(str[istr+1]==pattern[ipattern+1])
{
ipattern++;
if(ipattern==lpattern)
{
result.push_back(istr+1-lpattern);
ipattern=prev[ipattern];
}
}
else
{
do
{
ipattern=prev[ipattern];
if(str[istr+1]==pattern[ipattern+1])
{
ipattern++;
if(ipattern==lpattern)
{
// printf("i really doubt this\n");
}
}
}
while(ipattern>0);
}
}
fprintf(fout,"%d\n",result.size());
for(int i=0;i<result.size();i++)
{
fprintf(fout,"%d ",result[i]);
}
fclose(fin);
fclose(fout);
return 0;
}