Pagini recente » Cod sursa (job #3207771) | Cod sursa (job #1509186) | Cod sursa (job #1321755) | Cod sursa (job #2923451) | Cod sursa (job #2376463)
#include <iostream>
#include <fstream>
#include <cstring>
#define lim 2000005
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
char a[lim], b[lim];
int v[lim], n, m, cate=0;
void read()
{
in.getline(a, lim);
in.getline(b, lim);
n=strlen(a);
m=strlen(b);
}
void parcurgere_a()
{
v[0]=0;
int i=1, j=0;
while(i<n)
{
if(a[i]==a[j])
{
v[i]=j+1;
++j;
}
else
{
while(j>0 && a[i]!=a[j])
j=v[j-1];
if(a[i]==a[j])
{
v[i]=j+1;
++j;
}
else
{
v[i]=0;
j=0;
}
}
++i;
}
}
void parcurgere_b()
{
int i=0, j=0;
while(i<m)
{
if(a[j]==b[i])
{
++j;
}
else
{
j=v[j-1];
}
if(j==n && cate<=1000)
{
out<<i-n+1<<" ";
++cate;
j=v[j-1];
}
++i;
}
}
int main()
{
read();
parcurgere_a();/*
for(int i=0; i<n; ++i)
cout<<v[i]<<" ";*/
parcurgere_b();
return 0;
}