5
03/19/09 E. Giovannetti -- OI09. 1 Olimpiadi di Informatica 2009 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo 2009 Codici e pizzini.

03/19/09E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2009 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo 2009 Codici

Embed Size (px)

Citation preview

Page 1: 03/19/09E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2009 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo 2009 Codici

03/19/09 E. Giovannetti -- OI09. 1

Olimpiadi di Informatica 2009Giornate preparatorie

Dipartimento di InformaticaUniversità di Torino

marzo 2009

Codici e pizzini.

Page 2: 03/19/09E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2009 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo 2009 Codici

19/03/09 23.32 E. Giovannetti - AlgELab-0... - Lez.?? 2

Suggerimenti

Per ogni riga bisogna stabilire quanti anagrammi possiede.Per stabilire se due stringhe sono anagrammi basterebbe contare il numero delle diverse cifre di ciascuna stringa (cioè quanti 0, quanti 1, quanti 2, ecc.), e stabilire se sono identici; ciò si può fare in tempo lineare rispetto alla lunghezza della stringa. Ad esempio:

void contaCifre(string a, int count[10]) { for(int k = 0; k < 10; k++) count[k] = 0; int lun = a.size(); for(int i = 0; i < lun; i++) count[a[i] - '0']++;}

Page 3: 03/19/09E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2009 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo 2009 Codici

19/03/09 23.32 E. Giovannetti - AlgELab-0... - Lez.?? 3

Allora la funzione sonoAnagrammi è:

bool sonoAnagrammi(string a, string b) { int m = a.size(); int n = b.size(); if(m != n) return false; int aconti[10]; int bconti[10]; contaCifre(a, aconti); contaCifre(b, bconti); for(int i = 0; i < 10; i++) if(aconti[i] != bconti[i]) return false; return true;}

Page 4: 03/19/09E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2009 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo 2009 Codici

Per scrivere in fretta il programma ...

… forse meglio usare una funzione predefinita di sorting ...: due stringhe sono anagrammi se, ordinando i caratteri, esse risultano uguali:

bool sonoAnagrammi(string a, string b) {

if(a.size() != b.size()) return false;

sort(a.begin(), a.end());

sort(b.begin(), b.end());

return a == b;

}

Page 5: 03/19/09E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2009 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo 2009 Codici

Raffinamenti … non necessari.

La funzione sonoAnagrammi verrà richiamata molte volte su uno stesso argomento, e ogni volta si riesegue l'ordinamento della stringa,

Allora sarebbe più efficiente, ma più complicato, creare un array “parallelo” con le versioni ordinate di tutte le

stringhe;int main() { fin >> n; string righe[n]; for(int i = 0; i < n; i++) fin >> righe[i]; string righeOrd[n]; for(int i = 0; i < n; i++) { righeOrd[i] = righe[i]; sort(righeOrd[i].begin(), righeOrd[i].end()); } int counters[n]; ...