La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

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

Presentazioni simili


Presentazione sul tema: "03/19/09E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2009 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo 2009 Codici."— Transcript della presentazione:

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

2 19/03/ E. Giovannetti - AlgELab 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']++; }

3 19/03/ E. Giovannetti - AlgELab 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; }

4 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; }

5 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 > 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];...


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

Presentazioni simili


Annunci Google