Pagini recente » Cod sursa (job #1716926) | Cod sursa (job #2638778) | Cod sursa (job #1205711) | Cod sursa (job #2165217) | Cod sursa (job #1201363)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
const int BASE = 91;
const int MOD1 = ( 1 << 19 ) - 1;
const int MOD2 = 666013;
const int Lmax = 2e6 + 2;
char A[Lmax];
char B[Lmax];
int N, M;
vector <int> match;
int main()
{
ifstream in("strmatch.in");
ofstream out("strmatch.out");
in >> ( A + 1 );
in >> ( B + 1 );
N = strlen( A + 1 );
M = strlen( B + 1 );
int hashP1 = 0, hashP2 = 0;
int rollingHash1 = 0, rollingHash2 = 0;
int base1N = 1, base2N = 1;
if ( N > M )
{
out << "0\n";
return 0;
}
for ( int i = 1; i <= N; ++i )
{
///if ( i > 1 )
{
base1N = ( base1N * BASE ) % MOD1;
base2N = ( base2N * BASE ) % MOD2;
}
hashP1 = ( hashP1 * BASE + A[i] ) % MOD1;
hashP2 = ( hashP2 * BASE + A[i] ) % MOD2;
rollingHash1 = ( rollingHash1 * BASE + B[i] ) % MOD1;
rollingHash2 = ( rollingHash2 * BASE + B[i] ) % MOD2;
}
if ( hashP1 == rollingHash1 && hashP2 == rollingHash2 )
{
match.push_back( 0 );
}
for ( int i = N + 1; i <= M; ++i )
{
rollingHash1 = ( ( rollingHash1 * BASE ) % MOD1 + B[i] - ( base1N * B[i - N] ) % MOD1 + MOD1 ) % MOD1;
rollingHash2 = ( ( rollingHash2 * BASE ) % MOD2 + B[i] - ( base2N * B[i - N] ) % MOD2 + MOD2 ) % MOD2;
///rollingHash1 = ( ( rollingHash1 - ( base1N * B[i - N] ) % MOD1 + MOD1 ) * BASE + B[i] ) % MOD1;
///rollingHash2 = ( ( rollingHash2 - ( base2N * B[i - N] ) % MOD2 + MOD2 ) * BASE + B[i] ) % MOD2;
if ( hashP1 == rollingHash1 && hashP2 == rollingHash2 )
{
match.push_back( i - N );
}
}
out << match.size() << "\n";
for ( int i = 0; i < min( 1000, (int)match.size() ); ++i )
{
out << match[i] << " ";
}
out << "\n";
return 0;
}