Trie总结
Trie 樹即為字典樹
這個樹可以把所有我們要在文本中所查詢的前綴都記錄下來
當我們拿到一個文本串 需要從里面找出所有前綴串的數目我們就可以用這個結構
拿著我們的文本到這個樹里面走一走就得到有多少個前綴了
我們來看 當我們拿到一個前綴
不斷地把這個前綴插入到樹中
對每一個節點 可以連到26個分節點去
這個樹具體有兩個操作
一個是add操作
還有一個就是匹配操作
Trie的頭結點是空的
我們將我們想要統計的串加入到以頭結點為根的樹里
每一個前綴都是從根節點的一條路徑
我們可以看一道例題HDU 1251
輸入多個單詞
然后再輸入多個前綴 每一個前綴輸出字符串中出現當前前綴的單詞數量
這里我們就可以把所有單詞全部add到字典樹中
為他們建立查詢路徑
比如這里的trie的結構我們可以這么設置
time就記錄這里當前前綴已經走過多少次 也就是add過多少次
next表示 指向后面的字符的指針數組
add操作
void add(char s[]){int len = strlen(s);node *p = &e; //指向trie的指針for(int i=0;i<len;i++){if(!(p->next[s[i]-'a'])){//如果走到這里為空 就重新申請node *q = (node*)malloc(sizeof(node));(*q).init(); p->next[s[i]-'a']=q;}p = p->next[s[i]-'a'];p->time++; //并記錄前綴次數 }查詢:
int match(char s[]){int len = strlen(s);node *p = &e;for(int i=0;i<len;i++){if(p->next[s[i]-'a']==NULL)return 0;p = p->next[s[i]-'a'];}return p->time; }這里也就是把我們所要查找的串拿進來一個個匹配 看看能匹配到多少個
返回我們記錄的次數
完整代碼為:
#include<cstdio> #include<cstring> #include<cstdlib> using namespace std; struct node{int time;node *next[26];void init(){time = 0;for(int i=0;i<26;i++)next[i] = NULL;} }e; void add(char s[]){int len = strlen(s);node *p = &e; for(int i=0;i<len;i++){if(!(p->next[s[i]-'a'])){node *q = (node*)malloc(sizeof(node));(*q).init(); p->next[s[i]-'a']=q;}p = p->next[s[i]-'a'];p->time++;} } int match(char s[]){int len = strlen(s);node *p = &e;for(int i=0;i<len;i++){if(p->next[s[i]-'a']==NULL)return 0;p = p->next[s[i]-'a'];}return p->time; } char a[15]; int main() {e.init();while(*gets(a))add(a);while(~scanf("%s",a)){printf("%d\n",match(a));}return 0; }總結
- 上一篇: Adams— 系统级多体动力学仿真平台
- 下一篇: pat 1085 Perfect Seq