Tire樹(字典樹)資料結構詳解(圖解)及模板
阿新 • • 發佈:2018-12-10
先在這裡放模板,具體圖解回去再發
#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;
}