Pagini recente » Cod sursa (job #2026558) | Cod sursa (job #292003) | Cod sursa (job #3226449) | Cod sursa (job #3206914) | Cod sursa (job #2483568)
#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;
// poz_init=pozitii[nou[0]][0];
// poz_actual=poz_init;
// for (int i=1; i<marime; ++i)
// {
// marime1=pozitii[nou[i]].size();
// for (ind=0; ind<marime && pozitii[nou[i]][ind]<poz_actual; ++ind);
// if (ind==marime)
// {
// g << -1;
// return ;
// }
// else
// {
// poz_actual=pozitii[nou[i]][ind];
// }
// }
// cout << poz_actual-poz_init+1;
}
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;
}