Pagini recente » pre2 | Monitorul de evaluare | Statistici Linda Weinhopl (linda_wein) | Bombar | Cod sursa (job #974328)
Cod sursa(job #974328)
#include<fstream>
#include<string>
#include<vector>
using namespace std;
#define MAXN 2000001
#define PB 33
ifstream in("strmatch10.in");
ofstream out("strmatch.out");
vector<int> positions;
int hash_val;
int nr;
unsigned hash_function(const string& s)
{
long long ret = 0;
for (unsigned int i = 0; i < s.size(); i++)
ret = ret * PB + s[i];
return ret;
}
inline bool same_letters(string s) {
for(unsigned int i = 0; i < s.size(); i++) {
if(s[i] != s[0])
return false;
}
return true;
}
void rabin_karp(string s, string sub) {
unsigned int m = sub.size(), n = s.size();
long h_sub = hash_function(sub.c_str()),h_s;
h_s = hash_function(s.substr(0,m).c_str());
long long power = 1;
bool ok = same_letters(sub);
for (unsigned int i = 0; i < sub.size(); i++)
power = (power * PB);
for(unsigned int i = 0; i < n - m + 1; i++) {
if(ok && s[i] == s[i+m]) {
positions.push_back(i);continue;
}
if(h_s == h_sub) {
if(s.substr(i,m) == sub)
positions.push_back(i);
}
h_s = h_s * PB + s[i + m];
h_s -= power * s[i];
}
}
int main() {
string sub,s;
in>>sub>>s;
if(s.size() < sub.size()) {
out<<0<<"\n";
return 0;
}
rabin_karp(s,sub);
int len = positions.size();
out<<len<<"\n";
for(int i = 0; i < len; i++) {
if(i == 1000)
break;
out<<positions[i]<<" ";
}
return 0;
}