Pagini recente » Cod sursa (job #1428314) | Cod sursa (job #1471591) | Cod sursa (job #1507564) | Cod sursa (job #2396918) | Cod sursa (job #1295675)
#include <fstream>
#include <string>
using namespace std;
ifstream cin("strmatch.in");
ofstream cout("strmatch.out");
int n, i, m, j, prefix[2000005], a, k, f=0;
string s, p, pp;
int main()
{
cin>>p;
cin>>s;
m=p.size();
n=s.size();
p='%'+p;
s='%'+s;
a=0;
prefix[1]=0;
for(j=2; j<=m; ++j)
{
while(a>0 && p[a+1]!=p[j]) a=prefix[a];
if (p[a+1]==p[j]) ++a;
prefix[j]=a;
}
i=1; k=1; j=1;
while ( n-k >= m-1 )
{
while (j<=m && s[i]==p[j])
{
++i;
++j;
}
if (j>m)
{
cout<<k-1<<' ';
++f;
k=i;
if (prefix[j-1]>0) k=i-prefix[j-1];
if (f==1000) n=0;
}
else
{
if (i==k) ++i;
k=i;
}
if (j>1) j=prefix[j-1]+1;
}
return 0;
}