Pagini recente » Cod sursa (job #3005682) | Cod sursa (job #1044633) | Cod sursa (job #2602836) | Cod sursa (job #1571281) | Cod sursa (job #458269)
Cod sursa(job #458269)
#include<fstream>
#include<string.h>
#define inf "strmatch.in"
#define outf "strmatch.out"
#define D 73
#define MOD1 100007
#define MOD2 100021
#define NMax 2000100
using namespace std;
fstream f(inf,ios::in),g(outf,ios::out);
char P[NMax],T[NMax];
int N,M;
long long hp1,hp2,ht1,ht2;
int nr,sol[NMax];
void read()
{
f.get( P+1, NMax );
f.get();
f.get( T+1, NMax );
M = strlen( P+1 );
N = strlen( T+1 );
}
void solve()
{
//preprocesare pattern
long long put1=1,put2=1;
for(int i=1; i<=M; i++)
{
hp1 = ( (hp1*D)%MOD1 + P[i] ) % MOD1;
hp2 = ( (hp2*D)%MOD2 + P[i] ) % MOD2;
ht1 = ( (ht1*D)%MOD1 + T[i] ) % MOD1;
ht2 = ( (ht2*D)%MOD2 + T[i] ) % MOD2;
if( i!=M ) put1 = ( put1*D ) % MOD1 , put2 = (put2*D) % MOD2 ;
}
//matching
for(int i=1; i<=N-M+1; i++)
{
if( hp1==ht1 && hp2==ht2 ) sol[++nr] = i-1;
ht1 = ( ( ht1 - (put1*T[i])%MOD1 ) % MOD1 + MOD1 ) % MOD1 ;
ht1 = ( (ht1*D)%MOD1 + T[i+M] ) % MOD1;
ht2 = ( ( ht2 - (put2*T[i])%MOD2 ) % MOD2 + MOD2 ) % MOD2 ;
ht2 = ( (ht2*D)%MOD2 + T[i+M] ) % MOD2;
}
g<< nr <<"\n";
for(int i=1; i<=nr; i++) g<< sol[i] <<" ";
}
int main()
{
read(); solve();
f.close(); g.close();
return 0;
}