Pagini recente » Cod sursa (job #2977013) | Cod sursa (job #2526461) | Cod sursa (job #1114227) | Cod sursa (job #1398867) | Cod sursa (job #2424476)
#include <fstream>
#include <string>
#include <vector>
using namespace std;
string const inFile = "strmatch.in";
string const outFile = "strmatch.out";
ifstream Read(inFile);
ofstream Write(outFile);
inline bool CompareSubstringInString(
string const &_substring,
string const &_string,
unsigned const index
) {
for (unsigned i = 0; i < _substring.size(); ++i) {
if (i == _string.size()) {
return false;
}
if (_string[i + index] != _substring[i]) {
return false;
}
}
return true;
}
void SubstringMatching(
string const &_string,
string const &_substring,
vector<unsigned> &pos,
unsigned &_count
) {
if (_substring.size() > _string.size()) {
return;
}
int charCount = 1 << 8;
int prime = 1299709;
int _hash = 1;
int stringHash = 0;
int substringHash = 0;
unsigned i;
for (i = 1; i < _substring.size(); ++i) {
_hash = (_hash * charCount) % prime;
}
for (i = 0; i < _substring.size(); ++i) {
substringHash = (substringHash * charCount + _substring[i]) % prime;
stringHash = (stringHash * charCount + _string[i]) % prime;
}
unsigned limit = _string.size() - _substring.size() + 1;
for (i = 0; i < limit; ++i) {
if (substringHash == stringHash) {
if (CompareSubstringInString(_substring, _string, i) == true) {
++_count;
if (_count < 1000) {
pos.push_back(i);
}
}
}
if (i == limit - 1) {
break;
}
stringHash = (stringHash - _string[i] * _hash) * charCount;
stringHash = (stringHash + _string[i + _substring.size()]) % prime;
stringHash = (stringHash + prime) % prime;
}
}
int main() {
string _substring;
string _string;
vector<unsigned> pos;
unsigned _count = 0;
Read >> _substring;
Read >> _string;
SubstringMatching(_string, _substring, pos, _count);
Write << _count << '\n';
for (unsigned i = 0; i < pos.size(); ++i) {
Write << pos[i] << ' ';
}
return 0;
}