目的:已知n個長度不一定相同的母串,以及乙個長度為m的模式串t,求該模式串是否是乙個母串的字首。
時間複雜度:o(m)
特點:犧牲空間換取時間,常用於字串的快速檢索,快速排序與去重,文字的詞頻統計等。
模板
constview codeint max_n = 10000; //
trie 樹上的最大結點數
const
int max_c = 26; //
每個結點的子結點個數上限
struct
trie
void insert(char *str)
p = ch[p][str[i] - '
a']; //
在 trie 樹上繼續插入字串 str
} cnt[p]++;
}int find(char *str)
p = ch[p][str[i] - 'a'
]; }
return
cnt[p];}};
動態分配記憶體模板
constview codeint max_n = 10000; //
trie 樹上的最大結點數
const
int max_c = 26; //
每個結點的子結點個數上限
struct
trie
void insert(char *str)
if (ch[p][str[i] - '
a'] == -1)
p = ch[p][str[i] - '
a']; //
在 trie 樹上繼續插入字串 str
} cnt[p]++;
}int find(char *str)
p = ch[p][str[i] - 'a'
]; }
return
cnt[p];}};
自用模板
#include #includeview codeusing
namespace
std;
const
int maxn=10010
;struct
trie
intnewnode()
void insert(char *s)
u=ch[u][s[i]-'a'
]; ++cnt[u];}}
int query(char *s)
u=ch[u][s[i]-'a'
]; }
return
cnt[u];
}}trie;
intmain()
對串的快速檢索 trie樹
串的排序 trie樹+dfs
charview codenow[max_len];
void dfs(int p, int
len)
}for (int i = 0; i < 26; ++i) }}
n個字串,找出最長的len,使得s1到sn中,si是si+1的字首,且si是si+1的字尾
exkmp處理每個字串中哪些長度的字首和字尾相同,trie插入時動態更新最優解,開的trie樹需要動態分配記憶體
#includeusingview codenamespace
std;
const
int maxn=2e6+10
;int
dp[maxn];
struct
trie
void insert(char *s,int *next,int
idx)
if(ch[p][s[i]-'
a']==-1
)
p=ch[p][s[i]-'a'
];
if(cnt[p])
}cnt[p]=idx;
}}trie;
void getnext(char *s,int *next)
}}char
ch[maxn];
intnext[maxn];
intmain()
int ans=0
;
for(int i=1;i<=n;i++)
cout
return0;
}
Trie樹(字典樹)
trie樹的核心思想是用空間換時間,通過在樹中儲存字串的公共字首,來達到加速檢索的目的。例如,對於一棵儲存由英文本母組成的字串的trie樹,如下圖 trie樹在實現的時候,可以用左兒子右兄弟的表示方法,也可以在每個節點處開設乙個陣列,如上圖的方法。trie樹的主要操作是插入 查詢,也可以進行刪除。插...
字典樹 Trie樹
字典樹 trie樹 顧名思義是一種樹形結構,屬於雜湊樹的一種。應用於統計 排序 查詢單詞 統計單詞出現的頻率等。它的優點是 利用字串的公共字首來節約儲存空間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。字典樹的結構特點 根節點不代表任何字元。其他節點從當前節點回溯到根節點可以得到它代表的字串。...
字典樹 trie樹
amy 56 ann 15 emma 30 rob 27 roger 52首先存入amy,level 0表示根,不持有資料。其餘每個節點持有乙個字元 葉子節點持有資料,且持有的字元為 0 level 0 root a level 1 m level 2 y level 3 0 56 level 4新...