1. 程式人生 > >Tire樹(字典樹)資料結構詳解(圖解)及模板

Tire樹(字典樹)資料結構詳解(圖解)及模板

先在這裡放模板,具體圖解回去再發

#include <map>
#include <queue>
#include <cstdlib>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
#include <iostream>
#include <sstream>
#include <algorithm>
#define lowbit(a) (a&(-a))
#define _mid(a,b) ((a+b)/2) #define _mem(a,b) memset(a,0,(b+3)<<2) #define fori(a) for(int i=0;i<a;i++) #define forj(a) for(int j=0;j<a;j++) #define ifor(a) for(int i=1;i<=a;i++) #define jfor(a) for(int j=1;j<=a;j++) #define mem(a,b) memset(a,b,sizeof(a)) #define IN freopen("in.txt","r",stdin)
#define OUT freopen("out.txt","w",stdout) #define IO do{\ ios::sync_with_stdio(false);\ cin.tie(0);\ cout.tie(0);}while(0) #define mp(a,b) make_pair(a,b); using namespace std; typedef long long ll; const int maxn = 1e5; const int INF = 0x3f3f3f3f; const int inf = 0x3f; const double EPS = 1e-7
; const double Pi = acos(-1); const int MOD = 1e9+7; int Tire[maxn][26]; char str[2000005]; bool v[maxn]; string s; int cnt = 1; void _insert(){ int root = 0; fori(s.size()){ int next = s[i] - 'A'; if(!Tire[root][next]) Tire[root][next] = ++cnt; root = Tire[root][next]; } v[root] = true; } int _find(char bufs[],int leng){ int root = 0; int cns = 0; int next; int res = 0; fori(leng){ next = bufs[i] - 'A'; if(Tire[root][next] == 0) break; root = Tire[root][next]; cns++; if(v[root]) res = cns; } return v[root]?cns:res; } int main() { //IN; //IO; while(cin >> s){ if(s[0] == '.') break; _insert(); } char c; int leng = 0; while(~(c = getchar())){ if(c<='Z'&&c>='A') str[leng ++] = c; } str[leng] = 0; int Res = 0; int R = 0; int L = 0; int cns = 0; for(int i=0;i<leng;i++){ cns = _find(str+i,leng-i); if(R < i){ Res = max(Res,R-L); break; } R = max(cns+i,R); } cout << max(R-L,Res) << endl; return 0; }