安大校赛,“聪明的输入法”,字典树+树上状态记录
2014-03-27 16:34
120 查看
题意:每次询问:输出当前自库中以之为前缀的字符串频率最大的(相等时字典序最小)的字符串。 此题开始就跪,字典树不是问题,关键是解决每次输出就是把这个串在字典树跑了一遍之后(停在某 节点node),输出以node为根节点的子树中的权值最大的“终止节点”,这个问题,开始走w[u]最大的, 发现不行啊(反例很多),后来发现,给每个结点加一个状态,记录以它为根的子树中,权最大的串, (当然还有权值),,每插入一个串后,w[u]更新(u为终止结点),跟新每个结点的属性即可。 #include<iostream> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<queue> using namespace std; int tree[310000][27]; //字典树 struct node //结点属性 { int maxchild; string cs; };node nodes[310000]; int w[310100]; int numv=0; //点数 int n; void insert(string s) //插入s { queue<int>q; //再走一遍更新之用。 int u=0; int len=s.size(); for(int i=0;i<len;i++) { q.push(u); if(tree[u][s[i]-'a']==0) { tree[u][s[i]-'a']=++numv; } u=tree[u][s[i]-'a']; } q.push(u); w[u]++; while(!q.empty()) { int cur=q.front(); q.pop(); if(nodes[cur].maxchild<w[u]) //更新 { nodes[cur].maxchild=w[u]; nodes[cur].cs=s; } else if(nodes[cur].maxchild==w[u]) { if(nodes[cur].cs>s) nodes[cur].cs=s; } } } string find(string s) //查找 { int u=0; int len=s.size(); for(int i=0;i<len;i++) { if(tree[u][s[i]-'a']==0) return s; u=tree[u][s[i]-'a']; } return nodes[u].cs; } int main() { char ss[15]; scanf("%d",&n); string s; for(int i=0;i<n;i++) { scanf("%s",ss); s=ss; string ts=find(s); strcpy(ss,ts.c_str()); printf("%s\n",ss); insert(s); } return 0; }
相关文章推荐
- 安大校赛,“聪明的输入法”,字典树+树上状态记录
- 记录一下EditText监听输入法回车,以及更改输入法回车状态
- 分布式原理之四:全局状态和快照记录算法
- listview中Item记录点击状态的方法--(点击显示、隐藏的状态保存)
- leetcode -- 541. Reverse String II 【字符串反转 + 双指针 + 状态记录 + 数组与堆内存】
- LA 3942 Remember the Word(字典树/树上dp)
- 工作日志记录:模仿头条的评论功能输入框控制输入法并完整实现软键盘的在此环境下的UE控制
- [POJ2104]K-th Number(区间第k值 记录初始状态)
- 动态规划(入门,滚动数组,记录的都是状态):SWUSTACM-1010 魔兽争霸之最后的反击
- POJ 2411 记录状态的dp
- POJ 3764 The xor-longest( 树上异或前缀和&字典树求最大异或)
- c# wince 下获取当前输入法状态
- IOS开发之记录用户登陆状态
- 用DDL触发器来记录数据库中各对象的修改状态
- IOS开发之记录用户登陆状态
- redhat 6.3 64位安装中文输入法全过程记录
- WebSocket对象的“readyState”属性记录连接过程中的状态值
- Linux 记录服务器负载、内存、cpu状态的PHP脚本
- 记录一下自己的博客现在的状态
- hdu1074(状态压缩,DP,记录路径)