字典树模板
// 字典树模板
#include <bits/stdc++.h>
using namespace std;
struct{
int num; // 如该节点是一个单词的结尾,记录单词的编号
int next[26];
}trie[1000001];
string s[100001],a;
int tot,ans;
void Insert(string c,int k)
{
// 插入一个字符串
int i,t,len,p=1; // p表示标号
len = c.length(); // 获取字符串的长度
for(i = 0;i<len;i++) // 遍历
{
t=c[i]-'a'; // 字母的ascii
if(trie[p].next[t] ==0) // 说明没有对应的节点
{
tot++; // 新增编号为tot的节点
trie[p].next[t] = tot;// 记下p孩子节点的编号
p = trie[p].next[t]; // p 指向新添加的节点,一步迭代
}
else
{
p=trie[p].next[t]; // 若已经存在,再令p指向它
}
}
trie[p].num=k; // for循环执行完,证明第k个单词已经加入
}
int Find(string c) // 查找其中是否有字符串
{
int i,t,len,p=1;
len = c.length();
for(i = 0;i<len;i++)
{
t = c[i]-'a';
if(trie[p].next[t] ==0) return 0; // 没有要找的字符
p=trie[p].next[t]; // 若存在继续查找
}
return trie[p].num;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>s[i]>>a;
Insert(a,i);
}
for(int i=1;i<=m;i++)
{
cin>>a;
ans=Find(a);
if(ans) cout<<s[ans]<<endl;
else cout<<"None"<<endl; // 没找到
}
return 0;
}
蓝书代码:主要是迭代部分
int trie[SIZE][26],tot=1;
void Insert(char * str)
{
int len = strlen(str),p=1;
for(int k=0;k<len;k++)
{
int ch = str[k]-'a';
if(trie[p][ch]==0) trie[p][ch] =++tot;
p=trie[p][ch];
}
End[p] = true; // 该节点是终点
}
bool Search(char *str)
{
int len = strlen(str),p=1;
for(int k=0;k<len;k++)
{
p=trie[p][str[k]-'a'];
if(p==0) return false;
}
return End[p];
}
CF1285D
题意:题意:给定n个数,要求你设定一个X,这个X与每个数异或后所得的结果最小,并且这个X要尽可能的大,输出这个异或出的最小的结果
#include <bits/stdc++.h>
using namespace std;
int cnt=1;
int tri[1<<21][2];
void Insert(int x)
{
int p=1;
for(int i=29;i>=0;i--) // 一共三十位
{
int ch =(x>>i)&1; // 取出二进制最高位
if(tri[p][ch]==0) // p 是节点
{
tri[p][ch]=++cnt; // 统计个数
}
p=tri[p][ch];
}
}
int solve(int mode,int now)
{
if(mode==-1) // 小于0了返回0
return 0;
if(tri[now][0]==0)
return solve(mode-1,tri[now][1]); // 选择最小ans值所以选择已有的
else
if(tri[now][1]==0)
return solve(mode-1,tri[now][0]);
else
return ((1<<mode )+ min(solve(mode-1,tri[now][1]),solve(mode-1,tri[now][0]) )); // 因为要保证X是最大的,所以在最高有效位要留一个1才行
}
int main()
{
int n,a;
cin>>n;
while(n--)
{
cin>>a;
Insert(a);
}
cout<<solve(29,1)<<endl;
//return "BT7274", NULL;
}