Cod sursa(job #2576460)

Utilizator 700_or_disbandBest team 700_or_disband Data 6 martie 2020 19:36:28
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pli pair<ll,int>
#define pil pair<int,ll>
#define fi first
#define se second
#define inf (INT_MAX/2-1)
#define infl (1LL<<60)
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define sz(a) (int)(a).size()
#define all(a) begin(a),end(a)
#define y0 y5656
#define y1 y7878
#define aaa system("pause");
#define dbg(x) cerr<<(#x)<<": "<<(x)<<'\n',aaa
#define dbga(x,n) cerr<<(#x)<<"[]: ";for(int _=0;_<n;_++)cerr<<x[_]<<' ';cerr<<'\n',aaa
#define dbgs(x) cerr<<(#x)<<"[stl]: ";for(int _:x)cerr<<_<<' ';cerr<<'\n',aaa
#define dbgp(x) cerr<<(#x)<<": "<<x.fi<<' '<<x.se<<'\n',aaa
#define maxn 2000000

using namespace std;

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

string pat, txt;
int n, m;
int lps[maxn+5];
vi ans;

int main () {
  fin >> pat >> txt;
  m = sz(pat); n = sz(txt);
  int i, j, z, len = 0;
  lps[0] = 0; i = 1;
  while (i < m) {
    if (pat[i] == pat[len]) lps[i++] = ++len;
    else if (len > 0) len = lps[len-1];
    else lps[i++] = 0;
  }
  i = j = 0;
  while (i < n) {
    if (txt[i] == pat[j]) i++, j++;
    if (j == m) {
      ans.pb(i-m);
      j = lps[m-1];
    } else if (i < n && pat[j] != txt[i]) {
      if (j > 0) j = lps[j-1];
      else i++;
    }
  }
  fout << sz(ans) << '\n';
  for (i = 0; i < min(1000, sz(ans)); i++) fout << ans[i] << ' ';
  fin.close(); fout.close();
  return 0;
}