Trie是一种用来高效保存字符串的数据结构,是AC自动机多模匹配算法的基础
#include<iostream>
#include<stdio.h>
#include<string>
#include<string.h>
using namespace std;
#define maxnode 10000
//Trie树中的节点数
#define sigma 26
//26个小写英文字幕
//Trie类
class Trie{
public:
int ch[maxnode][sigma];
//ch[m][n]表示第m个节点的第n个子节点
int v[maxnode];
//记录字符串id的数组
int sz;
//当前节点数
Trie(){sz=1;memset(ch[0],0,sizeof(ch[0]));}
idx(char ch){return ch-'a';}
//计算ch字符的位置的简单函数
};
//树根
Trie R;
//插入一个字符串s,和记录相应的id
void insert(string s, int id){
int l = s.length();
int u = 0;
for(int i=0;i<l;i++){
if(R.ch[u][R.idx(s[i])] == 0){
//若该节点不存在
R.ch[u][R.idx(s[i])] = R.sz++;
R.v[u] = 0;
u = R.ch[u][R.idx(s[i])];
memset(R.ch[u],0,sizeof(R.ch[u]));
}else{
//若该节点存在,继续沿树边往下走
u = R.ch[u][R.idx(s[i])] ;
}
}
R.v[u] = id;
//达到字符串的末尾,记录该字符串的id
}
//查找函数,找得到则返回布尔值true和相应id
bool search(string s, int &id){
int l = s.length();
int u = 0;
for(int i=0;i<l;i++){
if(R.ch[u][R.idx(s[i])] != 0)
u = R.ch[u][R.idx(s[i])];
else
return 0;
}
id = R.v[u];
return id;
}
//用一个字典来测试
int main(){
freopen("input.txt","r",stdin);
string str;
int id;
for(int i=0;i<2000;i++){
cin >> id >> str;
//cout << id<<" "<< str<<endl;
insert(str,id);
}
string test[5] = {"well","rock","sun","hello","down"};
for(int i=0;i<5;i++){
id = 0;
if(search(test[i],id)){
cout <<test[i]<<" "<<id << endl;
``````
}else{
cout << "NOT FIND" <<endl;
}
}
}
main函数中我用一个字典来测试:
可以看到
96 well
98 down
你们也可以自己下载来试试哦
字典下载