Cod sursa(job #1269327)

Utilizator juniorOvidiu Rosca junior Data 22 noiembrie 2014 05:30:53
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <iostream>

using namespace std;

string p, t;
int urm[2000001], s[1001], pl, tl, i, j, ns;
ifstream fin("kmp.in");
ofstream fout("kmp.out");
/*
void prefix() {
  int i, q = 0;
  for (i = 2, pi[1] = 0; i <= M; ++i) {
    while (q && p[q + 1] != p[i])
      q = pi[q];
    if (p[q + 1] == p[i])
      ++q;
    pi[i] = q;
  }
}
*/
void prefix2() {
  int j, X = 0;
  urm[0] = 0;
  for (j = 1; j <= pl - 1; j++)
    if (p[X] == p[j]) {      // char match
      urm[j] = urm[X];
      X = X + 1;
    }
    else {                   // char mismatch
      urm[j] = X + 1;
      X = urm[X];
    }
}

int main () {
  fin >> p >> t;
  //cout << p << '\n' << t;
  pl = p.size();                // pattern length
  tl = t.size();                // text length
  prefix2();
  for (i = 0; i <= pl - 1; i++)
    cout << urm[i] << ' ';

  prefix2();
  for (i = 0, j = 0; i < tl; i++) {
    if (t[i] == p[j]) // char match
      j++;
    else // char mismatchs
      j = urm[j];
    if (j == pl) { // solutie
      ns++;
      if (ns <= 1000) {
        s[ns] = i - pl + 1;
        j = 1;
      }
    }
  }
  fout << ns << '\n';
  for (i = 1; i <= min(ns, 1000); i++)
    fout << s[i] << ' ';
}