Trie.cpp 1005 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. struct node { char a; int b,c,n; };
  2. // Set r = -1 for the first call to insert
  3. int insert(int *r, const char *s, node t[], int &m) {
  4. if(!*s) return 0;
  5. while(true) {
  6. while(*r != -1 && t[*r].a != *s) r = &t[*r].b;
  7. if(*r == -1) {
  8. t[m].a=*s;
  9. t[m].b = t[m].c = -1;
  10. t[m].n = 0;
  11. *r=m++;
  12. }
  13. if(*++s) r=&(t[*r].c);
  14. else return ++t[*r].n;
  15. }
  16. }
  17. // return -1=Not found, 0=not found but preffix, >0=found
  18. int match(int r, const char *s, node*t) {
  19. if(!*s) return -1;
  20. while(true) {
  21. while(r!=-1 && t[r].a != *s) r=t[r].b;
  22. if(r == -1) return -1;
  23. if(*++s) r=t[r].c; else return t[r].n;
  24. }
  25. }
  26. void test() {
  27. node n[256];
  28. int r = -1, m;
  29. insert(&r, "coucou", n, m);
  30. insert(&r, "ca", n, m);
  31. insert(&r, "va", n, m);
  32. assert(match(r, "coucou", n) > 0);
  33. assert(match(r, "ca", n) > 0);
  34. assert(match(r, "va", n) > 0);
  35. assert(match(r, "c", n) == 0);
  36. assert(match(r, "co", n) == 0);
  37. assert(match(r, "z", n) == -1);
  38. assert(match(r, "v", n) == 0);
  39. }