Advertisement
LucasLima

Cellphone Typing - UVa 12526

Nov 12th, 2012
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.62 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <string>
  6.  
  7. using namespace std;
  8.  
  9. #define PB push_back
  10.  
  11. #define REP(i,n) for(int i=0;i<(n);i++)
  12. #define SIZE(a) ((int)((a).size()))
  13.  
  14. struct Node {
  15.     int words;
  16.     int prefixes;
  17.     Node* edges[26];
  18.     int suffixes;
  19. };
  20.  
  21. void initialize(Node* vertex) {
  22.     vertex->words = vertex->prefixes = vertex->suffixes = 0;
  23.     REP(i,26) vertex->edges[i] = NULL;
  24. }
  25.  
  26. void addWord(Node* vertex, const string& word) {
  27.     Node* current = vertex;
  28.     for(int i = 0; i < SIZE(word); ++i) {
  29.         int k = word[i]-'a';
  30.         if(current->edges[k] == NULL) {
  31.             current->edges[k] = new Node();
  32.             initialize(current->edges[k]);
  33.             ++current->suffixes;
  34.         }
  35.         current = current->edges[k];
  36.         if(i == SIZE(word)-1){
  37.             ++current->words;
  38.         }
  39.         ++current->prefixes;
  40.     }
  41. }
  42.  
  43. Node* root;
  44.  
  45. int keystrokes(Node* vertex, const string& word) {
  46.     Node* current = vertex;
  47.     int ret = 0;
  48.     bool k = 0,k2 = 0;
  49.     ++ret;
  50.     for(int i = 0; i < SIZE(word); ++i) {
  51.         int x = word[i]-'a';
  52.         current = current->edges[x];
  53.         k2 =0;
  54.         if(current->suffixes > 1 && (i != SIZE(word)-1)) {
  55.             ++ret; k2 = 1;
  56.         }
  57.         if(i != (SIZE(word)-1) && (current->words > 0) && !k2) {
  58.             k = 1;
  59.         }
  60.         if(k && !k2) {
  61.             k = 0; ++ret;
  62.         }
  63.     }
  64.     return ret;
  65. }
  66.  
  67. char str[100];
  68.  
  69. int main () {
  70.     int n;
  71.     while(scanf("%d",&n) == 1) {
  72.         root = new Node();
  73.         vector<string> vs;
  74.         initialize(root);
  75.         REP(i,n) {
  76.             scanf("%s",str);
  77.             addWord(root,str);
  78.             vs.PB(str);
  79.         }
  80.         int sum = 0;
  81.         REP(i,n) {
  82.             int x = keystrokes(root,vs[i]);
  83.             sum+=x;
  84.         }
  85.         printf("%.2f\n", (double)sum/n);
  86.     }
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement