# Enciclopedia olimpica (enciclopedia)

**URL:** <https://forum.olinfo.it/t/enciclopedia-olimpica-enciclopedia/6303>\
**Category:** Aiuto\
**Created:** [3 Ottobre 2020, 3:05pm UTC](https://forum.olinfo.it/t/enciclopedia-olimpica-enciclopedia/6303 "2020-10-03T15:05:24Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Ignazio.Spacca](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/i/258eb7/32.png) [@Ignazio.Spacca](https://forum.olinfo.it/u/Ignazio.Spacca)\
**Post date:** [3 Ottobre 2020, 3:05pm UTC](https://forum.olinfo.it/t/enciclopedia-olimpica-enciclopedia/6303/1 "2020-10-03T15:05:24Z")

</div>

Ho fatto 10/100, con il caso 3, 7, 10 corretti e il resto sbagliati, non capisco dove sbaglio.

```auto
#include<bits/stdc++.h>
#define MAXN 10001

using namespace std;

int N, K;

string vet[MAXN];

string uppercase(string str)
{
	for(int i=0; i<str.length();i++)
		if(str[i]>='a'&&str[i]<='z')str[i]-=32;
	return str;
}

int ric(int i, int j){
	if(i>N){
		return 0;
	}
	if(i%K==0){
		if(vet[i-1].substr(0, j)!=vet[i].substr(0, j)){
			cout<<"-"<<uppercase(vet[i-1].substr(0, j))<<"\n";
			for(int z=1; z<=vet[i-1].length(); z++){
				if(vet[i-1].substr(0, z)!=vet[i].substr(0, z)){
					return ric(i+(K-1), z);
				}
			}
		}else{
			for(int z=j+1; z<=vet[i-1].length(); z++){
				if(vet[i-1].substr(0, z)!=vet[i].substr(0, z)){
					cout<<"-"<<uppercase(vet[i-1].substr(0, z))<<"\n";
					return ric(i+(K-1), z);
				}
			}
			cout<<"-"<<uppercase(vet[i-1])<<"\n";
			return ric(i+1, vet[i-1].length()+1);
		}
	}
	if(i==K-1 || (i-(K-1))%K==0){
		if(vet[i-(K-1)].substr(0, j)!=vet[i].substr(0, j)){
			cout<<uppercase(vet[i-(K-1)].substr(0, j));
			for(int z=1; z<=vet[i-(K-1)].length(); z++){
				if(vet[i-(K-1)].substr(0, z)!=vet[i].substr(0, z)){
					return ric(i+1, z);
				}
			}
		}else{
			for(int z=j+1; z<=vet[i-(K-1)].length(); z++){
				if(vet[i-(K-1)].substr(0, z)!=vet[i].substr(0, z)){
					cout<<uppercase(vet[i-(K-1)].substr(0, z));
					return ric(i+1, z);
				}
			}
			cout<<uppercase(vet[i-(K-1)]);
			return ric(i+1, vet[i-(K-1)].length()+1);
		}
	}
}

int main(){

	#ifdef EVAL
		freopen("input.txt", "r", stdin);
		freopen("output.txt", "w", stdout);
	#endif
	
	cin>>N>>K;
	
	for(int i=0; i<N; i++){
		cin>>vet[i];
	}
	ric(K-1, 1);
}

```

In poche parole chiamo la funzione ricorsiva solo sulle stringhe utili, e cerco la prima sottostringa diversa tra le due stringhe.

---

<div class="post-metadata">

**Author:** ![v.bizzarri](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/v/7c8e57/32.png) [@v.bizzarri](https://forum.olinfo.it/u/v.bizzarri)\
**Post date:** [4 Ottobre 2020, 8:17pm UTC](https://forum.olinfo.it/t/enciclopedia-olimpica-enciclopedia/6303/2 "2020-10-04T20:17:40Z")

</div>

Sto guardando ma se le pagine sono K in ogni pagina vanno inserite N/K voci non K.  
Forse i test corretti sono quelli per cui K=N/K.  
Con questa modifica, cioè ponendo K=N/K, si fa 30/100 e si sbagliano solo 3 test case: 4,12,15.  
Infine c’è una svista; una chiamata a ric non è corretta, modificata quella il tuo programma fa 100/100 anche se alla fine fa un controllo su vet[i] con i che vale N.  
nella ric ci sono due

> [@Ignazio.Spacca](#):
>
> `return ric(i+1, vet[i-1].length()+1);`

la prima va corretta con i-(K-1) al posto di i+1.

---

<div class="post-metadata">

**Author:** ![Ignazio.Spacca](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/i/258eb7/32.png) [@Ignazio.Spacca](https://forum.olinfo.it/u/Ignazio.Spacca)\
**Post date:** [5 Ottobre 2020, 10:00am UTC](https://forum.olinfo.it/t/enciclopedia-olimpica-enciclopedia/6303/3 "2020-10-05T10:00:45Z")

</div>

Grazie! Sono riuscito a fare 100/100.
