Pagini recente » Clasament Teme ACM Unibuc 2013 | Cod sursa (job #402757) | Cod sursa (job #2168763) | Cod sursa (job #2487710) | Cod sursa (job #2861197)
#pragma region Template
#include <bits/stdc++.h>
using namespace std;
#define ll long long
// ======== Files ========
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
#pragma endregion Template
vector<long> automata_prefix(string str) {
long len = str.length(), cnt = 0;
vector<long> pi(len);
for (long i = 1; i < len; i++) {
while (cnt != 0 && str[cnt + 1] != str[i])
cnt = pi[cnt];
if (str[cnt + 1] == str[i])
++cnt;
pi[i] = cnt;
}
return pi;
}
vector<long> automataKMP(vector<long> patt, string pattStr, string str) {
long lenPat = pattStr.length() - 1, lenStr = str.length();
vector<long> positions;
long cnt = 0;
for (long i = 1; i < lenStr; i++) {
while (cnt != 0 && pattStr[cnt + 1] != str[i]) {
cnt = patt[cnt - 1];
}
if (pattStr[cnt + 1] == str[i])
++cnt;
if (cnt == lenPat)
positions.push_back(i - lenPat);
}
return positions;
}
void prlong(vector<long> toPrlong) {
fout << toPrint.size() << '\n';
if (long(toPrint.size()) > 1000)
for (long i = 0; i < 1000; i++)
fout << toPrint[i] << ' ';
else
for (long i = 0; i < long(toPrint.size()); i++)
fout << toPrint[i] << ' ';
}
void solve() {
string pattern, text;
fin >> pattern >> text;
vector<long> prefixVector = automata_prefix(pattern);
vector<long> ans = automataKMP(prefixVector, pattern, text);
print(ans);
}
int main() {
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1; //cin >> t;
while (t--) {
solve();
}
return 0;
}