Pagini recente » Cod sursa (job #1182929) | Cod sursa (job #2481155) | Cod sursa (job #1559458) | Cod sursa (job #577253) | Cod sursa (job #2439512)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
char a[2000006],b[2000006];
long long p1=21564321,p2=21586321,mod1=698695723,mod2=536557673,stra,strb;
void citire()
{
fin>>a>>b;
stra=strlen(a);
strb=strlen(b);
}
void solve()
{
long long hasha1=0,hasha2=0,hashb2=0,hashb1=0,c1=1,c2=1;
vector<int> sol;
for(int i=0;i<stra;i++)
{
hasha1=(hasha1*p1+a[i])%mod1;
hasha2=(hasha2*p2+a[i])%mod2;
hashb1=(hashb1*p1+b[i])%mod1;
hashb2=(hashb2*p2+b[i])%mod2;
c1=c1*p1%mod1;
c2=c2*p2%mod2;
}
if(hasha1==hashb1 && hasha2==hashb2)
sol.push_back(0);
for(int i=stra;i<strb;i++)
{
hashb1=(mod1+(hashb1*p1)%mod1-(b[i-stra]*c1)%mod1+b[i])%mod1;
hashb2=(mod2+(hashb2*p2)%mod2-(b[i-stra]*c2)%mod2+b[i])%mod2;
if(hasha1==hashb1 && hasha2==hashb2)
{
sol.push_back(i-stra+1);
}
}
fout<<sol.size()<<'\n';
int x=sol.size();
for(int i=0;i<min(x,1000);i++)
fout<<sol[i]<<' ';
}
int main()
{
citire();
if(stra>strb)
{
fout<<0;
return 0;
}
solve();
return 0;
}