字典树+Codeforces1285D

字典树模板

// 字典树模板
#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;
}
发布了57 篇原创文章 · 获赞 3 · 访问量 2909
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章