Pagini recente » Cod sursa (job #94355) | Cod sursa (job #2438412) | Cod sursa (job #2820568) | Cod sursa (job #1628537) | Cod sursa (job #2861451)
#pragma region Template
#include <bits/stdc++.h>
using namespace std;
#define ll int int
// ======== Files ========
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
#pragma endregion Template
vector<int> automata_prefix(string str) {
int cnt = 0;
vector<int> pi(int(str.size()));
for (int i = 1; i < int(str.size()); i++) {
while (cnt && str[cnt] != str[i])
cnt = pi[cnt - 1];
if (str[cnt] == str[i])
++cnt;
pi[i] = cnt;
}
return pi;
}
vector<int> automataKMP(vector<int> patt, string pattStr, string str) {
vector<int> positions;
int cnt = 0;
for (int i = 1; i < int(str.size()); i++) {
while (cnt && pattStr[cnt] != str[i]) {
cnt = patt[cnt - 1];
}
if (pattStr[cnt] == str[i])
++cnt;
if (cnt == int(patt.size())) {
positions.push_back(i - int(patt.size()) + 1);
}
}
return positions;
}
void print(vector<int> toPrint) {
cout << toPrint.size() << '\n';
for (int i = 0; i < min(int(toPrint.size()), 1000); i++)
cout << toPrint[i] << ' ';
}
void solve() {
string pattern, text;
cin >> pattern >> text;
transform(pattern.begin(), pattern.end(), pattern.begin(), ::tolower);
transform(text.begin(), text.end(), text.begin(), ::tolower);
vector<int> prefixVector = automata_prefix(pattern);
vector<int> 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;
}