Correttore online – Intermedi
Una catena di parole di lunghezza n è una sequenza w1, w2, … , wn di parole in cui per ogni i (0 < i < n) la parola wi è un prefisso proprio della parola wi+1.
Si ricorda che una parola u di lunghezza k è un prefisso proprio della parola v di lunghezza h se h > k e le prime k lettere di v sono esattamente le stesse della parola u.
E’ dato un insieme di parole S = {s1, s2, …, sm}.
Trovare la catena di parole di lunghezza massima che può essere costruita usando le parole di questo insieme.Dati di input
La prima linea contiene un numero intero m (0 < m < 256).
Ciascuna delle successive m linee contiene una parola dell’insieme S.
Ogni parola consiste di una sequenza di n lettere minuscole dell’alfabeto latino, con 0 < n < 256.Dati di output
Produrre la lunghezza massima della catena di parole che può essere costruita con le parole di S.
Esempi di input/output
input.txt output.txt 3
a
ab
abc3 5
a
ab
bc
bcd
add2 Autore/i: A.S. Stankevich, ACM ICPC Team St. Petersburg State University of Information technology, Mechanics and Optics.
Utilizza le funzioni di string
/* www.valcon.it Correttore online - Intermedi - Catena di parole */ #include#include #include #include #define NMAX 256 using namespace std; int main() { ifstream fin ( "input.txt"); ofstream fout("output.txt"); int N; string parole[NMAX]; int conta, MAX=0; fin >> N; for(int i=0; i < N; i++) fin >> parole[i]; sort(parole, parole+N); // in ordine lessicografico conta=1; // trova la catena più lunga for(int i=0; i < N-1; i++) { // confronta la parola i-esima con la successiva, solo i caratteri effettivi int c=parole[i].compare(0, parole[i].length(), parole[i+1], 0, parole[i].length()); if(c == 0) conta++; else { if(conta > MAX) MAX=conta; conta=1; } } if(conta > MAX) // se anche l'ultimo confronto ha successo MAX=conta; fout << MAX; }