Pagini recente » Cod sursa (job #1542608) | Cod sursa (job #861500) | Cod sursa (job #2937422) | Cod sursa (job #931360) | Cod sursa (job #2905471)
// Mihai Priboi
#include <bits/stdc++.h>
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
#define MAXN 4000000
int z[MAXN];
string pattern, s;
void computeZ() {
int l, r, i;
l = r = 0;
for( i = 0; i < s.size(); i++ ) {
if( i > r ) {
l = r = i;
while( r < s.size() && s[r - i] == s[r] ) r++;
r--;
z[i] = r - l + 1;
}
else {
if( z[i - l] < r - i + 1 )
z[i] = z[i - l];
else {
l = i;
while( r < s.size() && s[r - i] == s[r] ) r++;
r--;
z[i] = r - l + 1;
}
}
}
}
int main() {
int i;
in >> pattern >> s;
s = pattern + '$' + s;
computeZ();
vector<int> rez;
for( i = pattern.size() + 1; i < s.size(); i++ ) {
if( z[i] == pattern.size() )
rez.push_back(i - pattern.size() - 1);
cout << z[i] << " ";
}
out << rez.size() << "\n";
for( auto x : rez )
out << x << " ";
return 0;
}