Cod sursa(job #3139998)

Utilizator RolandPetreanPetrean Roland RolandPetrean Data 3 iulie 2023 12:36:23
Problema Secv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.95 kb
// https://infoarena.ro/problema/secv
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'

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

int main() {
  int n;
  fin>>n;

  vector<int> a(n+1), vals;
  for (int i=1; i<=n; ++i) {
    fin>>a[i];
    vals.push_back(a[i]);
  }
  sort(vals.begin(), vals.end());
  vals.erase(unique(vals.begin(), vals.end()), vals.end());
  for (int i=1; i<=n; ++i) a[i] = upper_bound(vals.begin(), vals.end(), a[i])-vals.begin();

  int k=vals.size();

  vector<vector<int>> suf_first(k+2, vector<int>(n+2, n+1));
  for (int i=1; i<=k; ++i) {
    for (int j=n; j>=1; --j) {
      if (a[j] == i) suf_first[i][j] = j;
      else suf_first[i][j] = suf_first[i][j+1];
    }
  }

  int minl=n+1;
  for (int i=1; i<=n; ++i) {
    int first=suf_first[1][i], last=first;
    for (int i=2; i<=k; ++i) last = suf_first[i][last];
    if (last != n+1) minl = min(minl, last-first+1);
  }

  if (minl == n+1) fout<<-1;
  else fout<<minl;
}