Pagini recente » Cod sursa (job #3175594) | Cod sursa (job #2610741) | Cod sursa (job #3171669) | Cod sursa (job #3294206) | Cod sursa (job #3257655)
#include <bits/stdc++.h>
#define NMAX 5020200
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
string s,a;
char x,y;
int j, lps[NMAX],cnt,nr;
int main()
{
fin>>a>>s;
s="A"+a+s;
int i;
for( i=a.size(),x=s[i];i<s.size();++i,x=s[i])
{
y=s[lps[i-1]+1];
if(s[i]==s[lps[i-1]+1] && lps[i-1]+1<i)
{
lps[i]=lps[i-1]+1;
if(lps[i]==a.size())
++nr;
}
else
{
j=i-1;
while(s[lps[j]+1]!=s[i] && lps[j]!=0)
j=lps[j],y=s[lps[i]+1];
if(lps[j]==0 && s[1]==s[i] && i>1)
lps[i]=1;
if(lps[j]!=0 && s[lps[j]+1]==s[i] && lps[j]+1<i)
lps[i]=lps[j]+1;
if(lps[i]==a.size())
nr++;
}
}
fout<<nr <<'\n';
nr=min(nr, 1000);
for(int i=1;i<=s.size() && cnt<=nr;++i)
{if(lps[i]==a.size())
{
fout<<i-2*a.size()<<" ";
++cnt;
}}
// fout<<lps[i]<<" ";}
// fout<<'\n';
// for(int i=a.size();i<s.size();++i)
// fout<<s[i]<< " ";
return 0;
}