|
@@ -1,25 +1,39 @@
|
|
|
-const int maxnode = 40000;
|
|
|
-const int sigma_size = 26;
|
|
|
-struct Trie {
|
|
|
- int ch[maxnode][sigma_size];
|
|
|
- int val[maxnode];
|
|
|
- int sz; //nombre de noeuds
|
|
|
- void clear() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); } // initialisation
|
|
|
- int idx(char c) { return c - 'a'; }
|
|
|
- void insert(const char *s, int v) {
|
|
|
- int u = 0, n = strlen(s);
|
|
|
- for(int i = 0; i < n; i++) {
|
|
|
- int c = idx(s[i]);
|
|
|
- if(!ch[u][c]) { // il y'a pas de noeud correspondant
|
|
|
- memset(ch[sz], 0, sizeof(ch[sz]));
|
|
|
- val[sz] = 0;
|
|
|
- ch[u][c] = sz++;
|
|
|
- }
|
|
|
- u = ch[u][c];
|
|
|
+struct node { char a; int b,c,n; };
|
|
|
+// Set r = -1 for the first call to insert
|
|
|
+int insert(int *r, const char *s, node t[], int &m) {
|
|
|
+ if(!*s) return 0;
|
|
|
+ while(true) {
|
|
|
+ while(*r != -1 && t[*r].a != *s) r = &t[*r].b;
|
|
|
+ if(*r == -1) {
|
|
|
+ t[m].a=*s;
|
|
|
+ t[m].b = t[m].c = -1;
|
|
|
+ t[m].n = 0;
|
|
|
+ *r=m++;
|
|
|
}
|
|
|
- val[u] = v;
|
|
|
+ if(*++s) r=&(t[*r].c);
|
|
|
+ else return ++t[*r].n;
|
|
|
}
|
|
|
- void find(char *s){
|
|
|
- //TODO
|
|
|
+}
|
|
|
+// return -1=Not found, 0=not found but preffix, >0=found
|
|
|
+int match(int r, const char *s, node*t) {
|
|
|
+ if(!*s) return -1;
|
|
|
+ while(true) {
|
|
|
+ while(r!=-1 && t[r].a != *s) r=t[r].b;
|
|
|
+ if(r == -1) return -1;
|
|
|
+ if(*++s) r=t[r].c; else return t[r].n;
|
|
|
}
|
|
|
}
|
|
|
+void test() {
|
|
|
+ node n[256];
|
|
|
+ int r = -1, m;
|
|
|
+ insert(&r, "coucou", n, m);
|
|
|
+ insert(&r, "ca", n, m);
|
|
|
+ insert(&r, "va", n, m);
|
|
|
+ assert(match(r, "coucou", n) > 0);
|
|
|
+ assert(match(r, "ca", n) > 0);
|
|
|
+ assert(match(r, "va", n) > 0);
|
|
|
+ assert(match(r, "c", n) == 0);
|
|
|
+ assert(match(r, "co", n) == 0);
|
|
|
+ assert(match(r, "z", n) == -1);
|
|
|
+ assert(match(r, "v", n) == 0);
|
|
|
+}
|