Pagini recente » Cod sursa (job #844874) | Cod sursa (job #1110079) | Cod sursa (job #688575) | Cod sursa (job #2563546) | Cod sursa (job #1959945)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
#define K 666013
#define Q 10003
int h1,h2,m,n,i,sol[10005],s,nr,v1,v2,p1,p2;
char a[2000050],b[2000050];
int main()
{
f.getline(a,2000012);
f.getline(b,2000012);
m=strlen(a);
n=strlen(b);
p1=1;
p2=1;
for(i=0; i<m; ++i)
{
h1=( h1*101%K + (int)a[i])%K;
h2=( h2*109%Q + (int)a[i])%Q;
v1=( v1*101%K + (int)b[i])%K;
v2=( v2*109%Q + (int)b[i])%Q;
if (i>0)
{
p1*=101;
p1%=K;
p2*=109;
p2%=Q;
}
}
if (v1==h1 && v2==h2)
{
nr++;
sol[++s]=i-m;
}
for (i=m; i<n; i++)
{
v1 = (( v1-( int (b[i-m])*p1 ) % K + K) * 101 + int(b[i])) % K;
v2 = (( v2- (int (b[i-m])*p2 ) % Q + Q) * 109 + int(b[i])) % Q;
if (v1==h1 && v2==h2)
{
nr++;
if(nr<=1000)
sol[++s]=i-m+1;
}
}
g<<nr<<'\n';
for(i=1; i<=s; ++i)
g<<sol[i]<<" ";
return 0;
}