Pagini recente » Cod sursa (job #1531537) | Cod sursa (job #1616140) | Cod sursa (job #290858) | Cod sursa (job #1779839) | Cod sursa (job #1899227)
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
fstream f("strmatch.in");
ofstream q("strmatch.out");
string str, substr;
vector<int> solution;
f >> substr >> str;
vector<int> fallback;
fallback.push_back(-1);
fallback.push_back(0);
int size = substr.size();
int cnt = 0, i = 2;
while(i < size)
{
if (substr[i-1] == substr[cnt])
{
fallback.push_back(cnt + 1);
cnt++; i++;
}
else if (cnt > 0) cnt = fallback[cnt];
else fallback.push_back(0), i++, cnt = 0;
}
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)
{
solution.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;
}
q << solution.size() << "\n";
size = min(1000, static_cast<int>(solution.size()));
for (int i = 0; i < size; ++i) q << solution[i] << " ";
f.close();
q.close();
return 0;
}