Cod sursa(job #2181423)

Utilizator mouse_wirelessMouse Wireless mouse_wireless Data 21 martie 2018 17:43:20
Problema Potrivirea sirurilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#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] = f[1] = 0;
  for (int i = 2; i <= M; ++i) {
    if (p[i - 1] == p[f[i - 1]])
      f[i] = f[i - 1] + 1;
    else f[i] = 0;
  }
}

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 (i = 0; i < mnr; ++i)
    printf("%d ", m[i]);
  puts("");
  return 0;
}