Cod sursa(job #2905471)

Utilizator mihaipriboimihailucapriboi mihaipriboi Data 22 mai 2022 00:31:47
Problema Potrivirea sirurilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
// Mihai Priboi

#include <bits/stdc++.h>

using namespace std;

ifstream in("strmatch.in");
ofstream out("strmatch.out");

#define MAXN 4000000

int z[MAXN];

string pattern, s;

void computeZ() {
  int l, r, i;

  l = r = 0;
  for( i = 0; i < s.size(); i++ ) {
    if( i > r ) {
      l = r = i;
      while( r < s.size() && s[r - i] == s[r] ) r++;
      r--;
      z[i] = r - l + 1;
    }
    else {
      if( z[i - l] < r - i + 1 )
        z[i] = z[i - l];
      else {
        l = i;
        while( r < s.size() && s[r - i] == s[r] ) r++;
        r--;
        z[i] = r - l + 1;
      }
    }
  }
}

int main() {
  int i;

  in >> pattern >> s;
  s = pattern + '$' + s;

  computeZ();

  vector<int> rez;
  for( i = pattern.size() + 1; i < s.size(); i++ ) {
    if( z[i] == pattern.size() )
      rez.push_back(i - pattern.size() - 1);
    cout << z[i] << " ";
  }

  out << rez.size() << "\n";
  for( auto x : rez )
    out << x << " ";
  return 0;
}