Pagini recente » Profil robylex0942 | Monitorul de evaluare | Cod sursa (job #1695943) | Cod sursa (job #2009850) | Cod sursa (job #2721156)
#include <iostream>
#include <fstream>
#include <vector>
const int MAXN = 2e6 + 1;
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
string a,b;
string s;
int z[MAXN];
void zalgorithm(){
int n = s.size();
int l = -1,r = -1;
for(int i = 1; i < n; i++){
if(i > r){
int k = 0;
while(i + k < n && s[i + k] == s[k]){
k++;
}
l = i;
r = i + k - 1;
z[i] = k;
}else{
if(s[i] != s[0]){
z[i] = 0;
}else{
int initial = min(z[i],r - i + 1);
initial++;
int start = i + initial;
int k = 0;
while(start + k < n && s[start + k] == s[k + initial])
k++;
l = i;
r = i + initial + k - 1;
z[i] = initial + k;
}
}
}
// cout<<s.size()<<" "<<n<<endl;
// for(auto c : s)
// cout<<c<<" ";
// cout<<endl;
// for(int i = 0; i < s.size(); i++){
// cout<<z[i]<<" ";
// }
// cout<<endl;
vector<int>aparitii;
for(int i = a.size() + 1; i < n; i++){
if(z[i] >= a.size()){
// cout<<i - a.size() - 1<<" ";
aparitii.push_back(i - a.size() - 1);
}
}
out<<aparitii.size()<<'\n';
int sz = aparitii.size();
for(int i = 0; i < min(1000,sz); i++)
out<<aparitii[i]<<" ";
}
int main()
{
in>>a>>b;
s = a + '#' + b;
zalgorithm();
return 0;
}