Pagini recente » Istoria paginii warm-up-2004 | Sezon | pensula | Cercuri | Cod sursa (job #1586040)
#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 = 0;
for (auto i = 1; i < s.size(); ++i) {
while (k > 0 && s[k] != s[i])
k = pi[k - 1];
if (s[k] == 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);
size_t q = 0;
vector<int> result;
for (size_t i = 0; i < t.size(); ++i) {
while (q > 0 && s[q] != t[i])
q = pi[q - 1];
if (s[q] == t[i])
q++;
if (q == s.size())
result.push_back(i - s.size() + 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;
}