Pagini recente » Istoria paginii runda/oni2009x2/clasament | Cod sursa (job #1565941) | Cod sursa (job #1278295) | Statistici Vasut Armando Cristian (Armando1610290) | Cod sursa (job #2181446)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define mp make_pair
#define CHECK(x) if(!(x)) return false;
typedef pair<int, int> pii;
#ifdef INFOARENA
#define ProblemName "strmatch"
#endif
#define MCONCAT(A, B) A B
#ifdef ProblemName
#define InFile MCONCAT(ProblemName, ".in")
#define OuFile MCONCAT(ProblemName, ".out")
#else
#define InFile "fis.in"
#define OuFile "fis.out"
#endif
const int MAXN = 2000010;
const int MAXM = 1000;
int m[MAXM], mnr;
char s[MAXN], p[MAXN];
int f[MAXN];
int N, M;
void prec() {
f[0] = -1, f[1] = 0;
for (int i = 2; i <= M; ++i) {
int cur = f[i - 1];
for (; cur >= 0; cur = f[cur])
if (p[i - 1] == p[cur])
break;
f[i] = cur + 1;
}
}
int main() {
assert(freopen(InFile, "r", stdin));
assert(freopen(OuFile, "w", stdout));
scanf("%s%s", p, s);
M = strlen(p), N = strlen(s);
prec();
int i = 0, j = 0;
mnr = 0;
for (;j < N;) {
if (s[j] == p[i]) {
++i, ++j;
if (i == M) {
if(mnr < MAXM)
m[mnr] = j - M;
++mnr;
}
}
else if (i > 0)
i = f[i];
else ++j;
}
printf("%d\n", mnr);
for (int i = 0, lim = min(mnr, MAXM); i < lim; ++i)
printf("%d ", m[i]);
puts("");
return 0;
}