讲解字典树的视频:链接
不用字典树也能做,主要是用这个水题来熟悉一下字典树的写法,字典树(又叫trie树、前缀树)就是把一些字符串分解成字符存放在树结构上,常见的操作是插入字符串和查找字符串。
直接上代码:
#include<iostream>
#include<map>
#include<string>
using namespace std;
map<string,bool> mp;
int tree[30][1000005];
int idx=0;
bool cnt[1000005];
void insert(string s)//插入一个字符串到字典树中
{
int p=0;//p用来记录到达的结点,初始化为零是为了从根开始进行操作
for(int i=0;i<s.size();++i)//遍历string
{
int u=s[i]-'a';//映射字符到相应数字
if(!tree[u][p])//如果这个结点还没创建
{
tree[u][p]=++idx;//创建这个结点
}
p=tree[u][p];//继续往下进行
}
cnt[p]=1;//标记到此处为止存在一个字符串
}
string ask(string s)//查询字符串是否存在
{
int p=0;
for(int i=0;i<s.size();++i)
{
int u=s[i]-'a';//映射字符到相应数字
if(!tree[u][p])//中间一个字符不存在就代表树里没有这个字符串
{
return "WRONG";//返回没有字符串的情况
}
p=tree[u][p];//继续找
}
if(cnt[p])//如果当前的位置有字符串,说明找到了
{
return "OK";//返回找到了的情况
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;++i)
{
string s;
cin>>s;
insert(s);
}
int m;
cin>>m;
for(int i=1;i<=m;++i)
{
string s;
cin>>s;
if(!mp[s])
{
cout<<ask(s)<<endl;
}
else cout<<"REPEAT"<<endl;
mp[s]=1;
}
return 0;
}