Ho fatto 10/100, con il caso 3, 7, 10 corretti e il resto sbagliati, non capisco dove sbaglio.
#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.