Pagini recente » Cod sursa (job #247246) | Cod sursa (job #2155609) | Cod sursa (job #2832854) | Cod sursa (job #515531) | Cod sursa (job #984247)
Cod sursa(job #984247)
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstring>
#define REP(i, a, b) for(int i = a; i <= b; ++i)
#define FOR(i, n) REP(i, 1, n)
#define FOREACH(i, t) for (typeof(t.begin()) i = t.begin(); i != t.end(); ++i)
#define max(a, b) (a > b ? a : b)
#define min(a, b) (a < b ? a : b)
#define chmax(a, b) a = max(a, b)
#define chmin(a, b) a = min(a, b)
#define read(n) int (n); scanf("%d", &(n))
#define read2(n, m) int (n), (m); scanf("%d %d", &(n), &(m))
#define read3(n, m, k) int (n), (m), (k); scanf("%d %d %d", &(n), &(m), &(k))
#define ll long long
#define x first
#define y second
#define mp make_pair
using namespace std;
int n;
char P[2000010], S[2000010], x[4000010];
int F[2000100];
void failure() {
REP(i, 2, n) {
int pref = F[i - 1];
while (1) {
if (x[pref + 1] == x[i]) {
F[i] = pref + 1;
break;
}
if (!pref)
break;
pref = F[pref];
}
}
}
int main() {
freopen("strmatch.in", "r", stdin);
freopen("strmatch.out", "w", stdout);
gets(P); gets(S);
strcat(x + 1, P); strcat(x + 1, "#"); strcat(x + 1, S);
n = strlen(x + 1);
failure();
int cnt = 0, patCnt = strlen(P);
FOR(i, n)
if (F[i] == patCnt)
++cnt;
printf("%d\n", cnt);
cnt = 0;
FOR(i, n)
if (F[i] == patCnt) {
++cnt;
if (cnt == 1001)
break;
printf("%d ", i - 2 * patCnt - 1);
}
return 0;
}