Pagini recente » Cod sursa (job #822759) | Cod sursa (job #1798994) | Cod sursa (job #1658392) | Cod sursa (job #2557245) | Cod sursa (job #2126278)
#include <bits/stdc++.h>
#if 1
#define pv(x) cout<<#x<<" = "<<x<<"; ";cout.flush()
#define pn cout<<endl
#else
#define pv(x)
#define pn
#endif
using namespace std;
ifstream in("strmatch.in");
ofstream out("strmatch.out");
using ll = long long;
using ull = unsigned long long;
using uint = unsigned int;
#define pb push_back
const int NMax = 2e6 + 5;
const int inf = 1e9 + 5;
using zint = int;
int N,M,nrSol;
int pf[NMax],sol[NMax];
char patt[NMax],str[NMax];
int main() {
in>>(patt+1)>>(str+1);
N = strlen(patt+1);
M = strlen(str+1);
int k = 0;
for (int i = 2;i <= N;++i) {
while (patt[k+1] != patt[i] && k != 0) {
k = pf[k];
}
if (patt[k+1] == patt[i]) {
++k;
}
pf[i] = k;
}
k = 0;
for (int i = 1;i <= M;++i) {
while (patt[k+1] != str[i] && k != 0) {
k = pf[k];
}
if (patt[k+1] == str[i]) {
++k;
if (k == N) {
sol[++nrSol] = i - N;
k = pf[k];
}
}
}
out<<nrSol<<'\n';
nrSol = min(1000,nrSol);
for (int i = 1;i <= nrSol;++i) {
out<<sol[i]<<' ';
}
in.close();out.close();
return 0;
}