Pagini recente » Cod sursa (job #843816) | Cod sursa (job #2948035) | Cod sursa (job #1105804) | Cod sursa (job #568613) | Cod sursa (job #2717345)
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
ifstream cin("strmatch.in");
ofstream cout("strmatch.out");
const int MOD = 1e9 + 9;
const int base = 256;
int putere(int x, int p)
{
int aux = 1;
while (p)
{
if (p % 2)
aux = (1ll * aux * x) % MOD;
x = (1ll * x * x) % MOD;
p /= 2;
}
return aux;
}
char s[2000005], p[2000005];
int hp, hs;
vector<int> sol;
int main()
{
ios::sync_with_stdio(false);
cin.tie();
cin >> p >> s;
int np = strlen(p);
for (int i = 0; i < np; i++)
{
hp = (1ll * hp * base + p[i]) % MOD;
hs = (1ll * hs * base + s[i]) % MOD;
}
int ns = strlen(s);
int pBase = putere(base, np - 1);
for (int i = 0; i < ns - np + 1; i++)
{
if (i != 0)
{
hs -= (1ll * s[i - 1] * pBase) % MOD;
hs = (hs + MOD) % MOD;
hs = (1ll * hs * base) % MOD;
hs = (hs + s[i + np - 1]) % MOD;
}
if (hs == hp)
{
sol.push_back(i);
}
}
cout << sol.size() << '\n';
for (int i = 0; i < sol.size(); i++)
{
if (i == 1000)
break;
cout << sol[i] << ' ';
}
return 0;
}