Mam problem z tym zadaniem (wrzucam w załączniku, pochodzi z serwisu MAIN2), gdyż daje dobre odpowiedzi, niestety w niektórych testach przekracza minimalnie limity czasowe (w załączniku raport sprawdzania), sugeruje to, że rząd złożoności jest ok, wg mojego oszacowania to O(n^2), ale pewnie robię jakieś rzeczy niepotrzebnie, lub nie uwzględniam informacji o liczbie rodzajów smakołyków, co jest bardzo prawdopodobne, bo bez powodu jej nie podali. Algorytm to taka gąsienica, tylko nie do końca :D jeśli ciąg c[i] c[i+1] ... c[j] jest różnowartościowy to oczywiście ciągów zawierających c[j] jest j-i+1, więc o tyle zwiększamy licznik k, potem sprawdzamy indeks pierwszego wystąpienia c[j+1] w ciągu c[i] c[i+1] ... c[j+1], oczywiście poprzedni ciąg był różnowartościowy, więc w c[i]...c[j] może być co najwyżej jedno wystąpienie, jeśli otrzymamy j+1 oznacza to, że w ciągu c[i]...c[j] nie występuje c[j+1], więc do licznika dodajemy (j+1)-i+1, w przeciwnym razie dla wystąpienia p<j+1, wiemy że c[p+1] ... c[j+1] będzie różnowartościowym ciągiem i licznik zwiększamy o (j+1)-(p+1)+1, dalej będziemy rozpatrywać zakres p+1 do j+2, itd, aż dojdziemy do końca tablicy, mam nadzieje, że bardziej pomogłem w zrozumieniu mojego toku myślenia, niż przeszkodziłem :)
#include<stdio.h>
using namespace std;
int n,m;//n-ilość smakołyków m-ilość dostępnych rodzajów
int c[1000000];//rodzaje kolejnych smakołyków
void g_data(int &n1,int &m1,int tab[])//pobiera dane
{
scanf("%i%i",&n1,&m1);
for(int i=0;i<n1;i++)
{
scanf("%i",&tab[i]);
}
}
int srch_f_same(int tab[],int p,int e)//dla tab[e] wyszukuje indeks pierwszego jego wystąpienia w zakresie tab[p]...tab[e]
{
int i=p;
while(i<e+1)
{
if(tab[e]==tab[i])
return i;
i++;
}
}
int ciag_max(int &n1,int &m1,int tab[])
{
int i=0;//indeks początku zakresu
int k=0;//licznik-odpowiedź na pytanie z zadania
int i_p=0;
for(int j=0;j<n1;j++)
{
i_p=srch_f_same(tab,i,j);
if(i_p!=j)
i=i_p+1;
k+=(j-i+1);
}
return k;
}
int main()
{
g_data(n,m,c);
printf("%i",ciag_max(n,m,c));
return 0;
}