Pagini recente » Cod sursa (job #2817436) | Cod sursa (job #438753) | Cod sursa (job #1959735) | Cod sursa (job #1757172) | Cod sursa (job #1282539)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
const int MOD1 = 666013, MOD2 = 666019;
const int X1 = 7, X2 = 13;
const int NMax = 2000010;
char A[NMax], B[NMax];
vector <int> ans;
void Read()
{
ifstream f ("strmatch.in");
f >> A;
f >> B;
f.close();
}
void Solve()
{
int code1 = 0, code2 = 0, now1 = 0, now2 = 0;
int max1 = 1, max2 = 1;
int N = strlen(A), M = strlen(B);
for (int i = 1; i < N; ++ i)
max1 = (max1 * X1) % MOD1,
max2 = (max2 * X2) % MOD2;
for (int i = 0; i < N; ++ i)
code1 = (code1 * X1 + A[i]) % MOD1,
code2 = (code2 * X2 + A[i]) % MOD2;
for (int i = 0; i < N; ++ i)
now1 = (now1 * X1 + B[i]) % MOD1,
now2 = (now2 * X2 + B[i]) % MOD2;
if (now1 == code1 && now2 == code2)
ans.push_back(0);
for (int i = N; i < M; ++ i)
{
now1 -= (max1 * B[i-N]) % MOD1;
now2 -= (max2 * B[i-N]) % MOD2;
if (now1 < 0) now1 += MOD1;
if (now2 < 0) now2 += MOD2;
now1 = (now1 * X1 + B[i]) % MOD1;
now2 = (now2 * X2 + B[i]) % MOD2;
if (now1 == code1 && now2 == code2)
ans.push_back(i - N + 1);
}
}
void Write()
{
ofstream g ("strmatch.out");
g << (int)ans.size() << "\n";
for (int i = 0; i < min(1000, (int)ans.size()); ++ i)
g << ans[i] << " ";
g << "\n";
g.close();
}
int main()
{
Read();
Solve();
Write();
return 0;
}