Pagini recente » Profil vlad_oltean | cntnk | Monitorul de evaluare | pisici | Cod sursa (job #1586039)
#include <fstream>
#include <string>
#include <vector>
using namespace std;
/**@brief Find prefixes of s that match suffixes of s_i
*/
vector<int> prefix(const string& s) {
vector<int> pi(s.size());
int k = -1;
for (auto i = 1; i < s.size(); ++i) {
while (k >= 0 && s[k + 1] != s[i])
k = pi[k];
if (s[k + 1] == s[i])
k++;
pi[i] = k;
}
return pi;
}
/**@brief Find matches of s in t.
*
* Implements the Knuth-Morris-Pratt pattern matching algorithm.
*/
vector<int> match(const string& s, const string& t) {
auto pi = prefix(s);
int q = -1;
int n = static_cast<int>(s.size());
vector<int> result;
for (auto i = 0; i < t.size(); ++i) {
while (q >= 0 && s[q + 1] != t[i])
q = pi[q];
if (s[q + 1] == t[i])
q++;
if (q == n - 1)
result.push_back(i - n + 1);
}
return result;
}
int main() {
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
string s, t;
fin >> s >> t;
auto result = match(s, t);
fout << result.size() << endl;
for (int i = 0; i < min(1000, static_cast<int>(result.size())); ++i) {
fout << result[i] << " ";
}
fout << endl;
return 0;
}