Cod sursa(job #2483570)

Utilizator victorv88Veltan Victor victorv88 Data 29 octombrie 2019 21:48:06
Problema Secv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;

ifstream f("secv.in");
ofstream g("secv.out");

unordered_map<int,bool>fr;
unordered_map<int,vector<int>>pozitii;

int n, sir[5005], dp[5005];
vector<int>nou;

void solve()
{
    int marime=nou.size();
    int ind, marime1, marime2;
    int poz_init, poz_final, poz_actual;
    for (int &v:pozitii[nou[0]])
        dp[v]=v;
    for (int i=1; i<marime; ++i)
    {
        marime1=pozitii[nou[i]].size();
        marime2=pozitii[nou[i-1]].size();
        ind=0;
        for (int j=0; j<marime1; ++j)
        {
            for (ind; ind<marime2 && pozitii[nou[i-1]][ind]<pozitii[nou[i]][j]; ++ind);
            if (ind==0)
            {
                dp[pozitii[nou[i]][j]]=9999999;
                ind=0;
            }
            else
            {
                ind--;
                dp[pozitii[nou[i]][j]]=dp[pozitii[nou[i-1]][ind]];
            }
        }
    }
    int mini=9999999;
    int marime_ultim=nou.size();
    for (int &v:pozitii[nou[marime-1]])
        {
            if (dp[v]!=9999999 && v-dp[v]+1<mini)
                mini=v-dp[v]+1;
        }

    if (mini==9999999)
    {
        g << -1;
        return;
    }
    g << mini;

}

int main( ) {
    f >> n;
    for (int i=1; i<=n; ++i)
    {
        f >> sir[i];
        if (fr[sir[i]]==false)
        {
            fr[sir[i]]=true;
            nou.push_back(sir[i]);
        }
        pozitii[sir[i]].push_back(i);
    }
    sort(nou.begin(),nou.end());
    solve();
    return 0;
}