字串的多模匹配,kmp,字典樹,ac自動機,現在學習字典樹;
字典樹又稱為單詞查詢樹,用於統計,排序和儲存大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻的統計。優點是利用字串的公共字首來減少查詢時間,最大限度減少無畏字串比較,查詢效率比雜湊樹高。
其實字典樹就是dfa!!,每層是乙個狀態,只不過我覺得這棵樹的空間利用率不高罷了(hdu1251,g++mle怨念ing)。
1.根節點不包含字元,根節點外每個節點都只包含乙個字元
2.根節點到某一節點上,路徑上經過的字元拼接起來,為該節點對應的字串;
3.每個節點的所有子節點包含的字元都不相同。
基本操作:查詢,插入,刪除(少見)
1.從根節點開始一次搜尋。
2.取得要查詢關鍵字的第乙個字母,並根據該字母選擇對應的子樹並轉到該子樹進行檢索
4.迭代
2. 串的排序:給定n個互不相同的僅有乙個單詞構成的英文名,讓你將他們安字典序大小,從小到大輸出。用字典樹進行排序,採用陣列的方式建立建立字典樹,這棵樹的每個節點的所有子節點很顯然按照其字母大小排序,對這棵樹進行先序遍歷即可。
3.最長公共字首:對所有串建立字典樹,對於兩個串的最長公共字首的長度,即他們所在節點的公共祖先個數,於是,問題轉外化為當時公共祖先問題。
4.學習自動機的熱身
首先是乙個板子:
//#pragma comment(linker, "/stack:1024000000,1024000000")
#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
#define ll long long
#define pair pair//#define max(a,b) (a)>(b)?(a):(b)
//#define min(a,b) (a)<(b)?(a):(b)
#define clean(a,b) memset(a,b,sizeof(a))// 水印
//std::ios::sync_with_stdio(false);
// register
const int maxn=1e3+10;
const int inf32=0x3f3f3f3f;
const ll inf64=0x3f3f3f3f3f3f3f3f;
const ll mod=1e9+7;
const double pi=acos(-1.0);
//---------------------------
const int maxn=26;//假設只有小寫字母
const int maxm=1e5+10;
struct treenodehead;
for(int i='a';i<='z';++i)
}void init_trie()
return newnode;
}void updata(char *s,int num)
t->count+=num;//以該字串為前驅的再加num個。
}int search(char *s,int num)
//這裡只是單純的查詢字串s,後面不能多,前面不能少。
int snum=t->count;//最後存在的 個數
for(int i=0;inext[i])
} if(snum>=num)
return 0;
}void erase(char *s,int num)
t=t->next[temp];
k++;
} while(s[k])
free(t1);
}char temp[1000];
void printall(treenode* tnode,int pos)
for(int i=0;i>oper)
else if(oper==2)
else }
} /*12
21add 143
4*/
然後在hdu上找了個板子題:hdu-1251-統計難題:
直接ac:
const int maxn=28;
const int inf32=0x3f3f3f3f;
const ll inf64=0x3f3f3f3f3f3f3f3f;
const ll mod=1e9+7;
const double pi=acos(-1.0);
//---------------------------
struct nodetree;
void intt()
t->nxt[s[k]-'a']=p;
} t=t->nxt[s[k]-'a'];
++k;
} t->count++;
}int query(char *s)
return t->count;
}int main()
}}root;
void insert(string s1,string s2)
t=t->nxt[s1[i]-'a'];
} t->vis=1;t->word=s2;
}string find(string s)
string res="";
if(t->vis==1)
return res;
}int main()
char ch=getchar();//我在這個地方加乙個換行
char s[3100]=;
while(gets(s))
e+=s[k++];
} cout<}}
字典樹學習總結
解決問題 主要應對多次查詢,典例就是字典,字典樹就是一本字典,字典的最大好處就是能快速查詢 主要原理 我們在查某乙個單詞時總會先索引第乙個字母,然後在查第二個字母,以此類推直到查到此單詞為止,那麼字典樹的查詢過程也是如此,先查第乙個字母的節點位置,然後在該節點的子節點之中查詢第二個字母的位置,以此類...
trie樹學習總結(字典樹模板)
trie樹 演算法簡介 字典樹,也叫trie樹,是一種比較實用的資料結構,無論是在acm競賽的題目中,還是字串相關的某些實際應用領域內,它都能發揮巨大的作用。首先來看看字典樹的本質是什麼。它其實是一棵儲存了很多字串的樹,這棵樹上的每一條邊就是某個或某些字串中的乙個字元,而從根節點到某乙個特定節點所經...
蒟蒻 字典樹學習總結
又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。根節點不包含字元,除根節點外每乙個節點都只...