2013年11月10日 星期日

[Data Structure] Trie


#include<stdio.h>
#include<string.h>
#define node 5000
#define sigma 60
//module start
struct Trie{
    int ch[node][sigma];
    int val[node];
    int size;
    Trie(){
        size=1;
        memset(ch,0,sizeof(ch));
        memset(val,0,sizeof(val));
    }
    int id(char c){
        if(c<='Z' && c>='A')
            return c-'A'+26;
        if(c<='z' && c>='a')
            return c-'a';
    }
    char C(int n){
        if(n<26) return n+'a';
        return n-26+'A';
    }
    void insert(char *s,int v){
        int u=0,n=strlen(s),i;
        for(i=0;i<n;i++){
            int c=id(s[i]);
            if(ch[u][c]==0){
                ch[u][c]=size++;
            }
            u=ch[u][c];
        }
        val[u]=v;
    }
    int serch(char *s){
        int u=0,n=strlen(s),i;
        for(i=0;i<n;i++){
            int c=id(s[i]);
            u=ch[u][c];
        }
        return val[u];
    }
    void dfs(int u,int v,char *s){
        int i;
        for(i=0;i<52;i++){
            int n=ch[u][i];
            if(n){
                s[v]=C(i);
                if(val[n]) s[v+1]=0,puts(s);
                dfs(n,v+1,s);
            }
        }
    }
    void print(){
        char r[1005];
        dfs(0,0,r);
    }
};
//end
Trie tree;
char s[1005];
int main(){
    int x,n;
    Trie(tree);
    while(scanf("%d %s",&x,s)!=EOF){
        n=tree.serch(s);
        //插入字串
        if(x==1){
            if(n==-1) tree.insert(s,1);
            else{
                tree.insert(s,n+1);
            }
        }
        //查詢字串次數
        else{
            printf("%d\n",n);
        }
    }
    //印出所有字串
    tree.print();
}

沒有留言:

張貼留言