Pagini recente » Monitorul de evaluare | Cod sursa (job #1428690) | Cod sursa (job #1792478) | Cod sursa (job #1059084) | Cod sursa (job #1748075)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
const int mod1 = 666019;
const int mod2 = 666013;
const int baza = 26;
vector <int> sol;
string a, b;
int main()
{
getline(in, a);
getline(in, b);
int m = a.size();
int n = b.size();
int nr1 = 0;
int nr2 = 0;
for(int i = 0; i < m; i++)
{
nr1 = (nr1 * 26 + a[i] - 'A' + 1) % mod1;
nr2 = (nr2 * 26 + a[i] - 'A' + 1) % mod2;
}
int q = 1;
for(int i = 1; i < m; i++)
q = q * 26;
int act1 = 0;
int act2 = 0;
for(int i = 0; i < m; i++)
{
act1 = (act1 * 26 + b[i] - 'A' + 1) % mod1;
act2 = (act2 * 26 + b[i] - 'A' + 1) % mod2;
}
int rez = 0;
for(int i = m; i < n; i++)
{
if(nr1 == act1 && nr2 == act2)
{
sol.push_back(i - m);
rez++;
}
act1 = (act1 - q * (b[i - m] - 'A' + 1) % mod1 + mod1) % mod1;
act2 = (act2 - q * (b[i - m] - 'A' + 1) % mod2 + mod2) % mod2;
act1 = (act1 * 26 + b[i] - 'A' + 1) % mod1;
act2 = (act2 * 26 + b[i] - 'A' + 1) % mod2;
}
if(nr1 == act1 && nr2 == act2)
{
sol.push_back(n - m);
rez++;
}
out << rez << "\n";
for(int i = 0; i < min((int)sol.size(), 1000); i++)
out << sol[i] << " ";
return 0;
}