Pagini recente » Cod sursa (job #539605) | Cod sursa (job #2917203) | Cod sursa (job #3249138) | Cod sursa (job #1496243) | Cod sursa (job #2984308)
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
ifstream fin ("strmatch.in");
ofstream fout ("strmatch.out");
const int mod1 = 1e9 + 7;
const int mod2 = 1e9 + 9;
vector <int> ans;
int main()
{
string pattern; fin >> pattern;
string sir; fin >> sir;
int power1 = 1, power2 = 1;
for(int i = 1; i < pattern.size(); i++) {
power1 = 1ll * power1 * 31 % mod1;
power2 = 1ll * power2 * 29 % mod2;
}
int Hash1 = 0, Hash2 = 0;
for(int i = 0; i < pattern.size(); i++) {
Hash1 = 1ll * (1ll * Hash1 * 31 + 1ll * (pattern[i]-'A'+1)) % mod1;
Hash2 = 1ll * (1ll * Hash2 * 29 + 1ll * (pattern[i]-'A'+1)) % mod2;
}
int H1 = 0, H2 = 0;
for(int i = 0; i < pattern.size(); i++) {
H1 = 1ll * (1ll * H1 * 31 + 1ll * (sir[i]-'A'+1)) % mod1;
H2 = 1ll * (1ll * H2 * 29 + 1ll * (sir[i]-'A'+1)) % mod2;
}
if(H1 == Hash1 && H2 == Hash2)
ans.push_back(pattern.size());
for(int i = pattern.size(); i < sir.size(); i++) {
H1 = H1 - (sir[i-pattern.size()]-'A'+1) * power1;
if(H1 < 0) H1 += mod1;
H1 = (1ll * H1 * 31 % mod1 + (sir[i]-'A'+1)) % mod1;
H2 = H2 - (sir[i-pattern.size()]-'A'+1) * power2;
if(H2 < 0) H2 += mod2;
H2 = (1ll * H2 * 29 % mod2 + (sir[i]-'A'+1)) % mod2;
if(H1 == Hash1 && H2 == Hash2)
ans.push_back(i);
}
fout << ans.size() << "\n";
for(int i = 0; i < min(1000, (int) ans.size()); i++)
fout << ans[i] - pattern.size() + 1 << " ";
return 0;
}