Pagini recente » Cod sursa (job #144915) | Cod sursa (job #1139996) | Cod sursa (job #120796) | Cod sursa (job #2031098) | Cod sursa (job #1899164)
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
fstream f{ "strmatch.in" };
ofstream q{ "strmatch.out" };
void initFailureFunction(string& str, vector<int>& fallback)
{
fallback.push_back(-1);
fallback.push_back(0);
int size = str.size();
auto cnt = 0, i = 2;
while(i < size)
{
if (str[i-1] == str[cnt])
{
fallback.push_back(cnt + 1);
cnt++; i++;
}
else if (cnt > 0) cnt = fallback[cnt];
else fallback.push_back(0), i++, cnt = 0;
}
}
void KMP(string& str, string& substr, vector<int>& sols)
{
vector<int> fallback;
initFailureFunction(substr, fallback);
int current = 0, sizeStr = str.size(), sizeSubstr = substr.size(), start = 0;
while(start + current < sizeStr)
{
if (str[start + current] == substr[current])
{
if (current == sizeSubstr - 1)
{
sols.push_back(start);
start = start + current - fallback[current];
current = fallback[current];
}
else current++;
}
else if (fallback[current] > -1) start = start + current - fallback[current], current = fallback[current];
else start++, current = 0;
}
}
int main()
{
string str, substr;
vector<int> solution;
int size;
f >> substr >> str;
KMP(str, substr, solution);
q << solution.size() << "\n";
size = min(1000, static_cast<int>(solution.size()));
for (auto i = 0; i < size; ++i) q << solution[i] << " ";
q<<'\n';
f.close();
q.close();
return 0;
}