Pagini recente » Cod sursa (job #1785443) | Cod sursa (job #1020142) | Cod sursa (job #445742) | Cod sursa (job #37586) | Cod sursa (job #3254671)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
string a, b;
int pi[2000005], numberOcc;
vector<int> indexes;
void read() {
f>>a;
f>>b;
a.insert(0, " ");
b.insert(0, " ");
f.close();
}
void precompute() {
int q = 0;
for(int i = 2;i < a.size();++i) {
while(q && a[q + 1] != a[i]) {
q = pi[q];
}
if(a[q + 1] == a[i]) {
q++;
}
pi[i] = q;
}
}
void compute() {
int q = 0;
for(int i = 1;i < b.size();++i) {
while(q && a[q + 1] != b[i]) {
q = pi[q];
}
if(a[q + 1] == b[i]) {
q++;
}
cout<<q<<" ";
if(q == a.size() - 1) {
cout<<"da\n";
++numberOcc;
if(indexes.size() < 1000) {
indexes.push_back(i - q);
}
q = pi[q];
}
}
}
void print() {
g<<numberOcc<<'\n';
for(const int& index : indexes) {
g<<index<<" ";
}
g.close();
}
int main() {
read();
precompute();
compute();
print();
return 0;
}