POJ2004 Mix and build Trie树? dp?
学习Trie树中,所以上网搜一下Trie树的题,找到这个,人家写着是简单dp,那我就想着能学习到什么Trie树上的dp,但最后发现根本好像跟Trie树没有什么联系嘛...
题意就是给你很多个字符串(长度<20),然后如果两个字符串在排序完后,左边的一个+一个字符能变成右边的,这两个字符串连上一条边,然后求最长的边.我想了半天怎么跟Trie不搭边... 一个自然的想法是这样的,记d[i]为序号为i的字符串作为结束字符串的最长长度,我先把所有字符串根据长度由小到大排序,然后对每个字符串k,我每次把起中一个字符去掉,看这个新字符串j存不存在,如果存在d[k]=max(d[k],d[j]+1).然后记下最大的那个,递归打印一下好.如果非要用Trie那就是实现一个基本的插入查找的功能,这个哈希可能比它快多了,实在不行map也是可以的.不过Trie应该快过map.既然学习这个我就当作练下手吧...最近这两天都是RE..姿势不对呀
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#define maxn 10000
using namespace std; struct StrNode
{
char sd[25];
char s[25];
int id;
bool operator < (const StrNode &b) const
{
return strlen(this->sd)<strlen(b.sd);
}
}str[maxn+50]; int d[maxn+50]; // 记下最大的距离
int prevv[maxn+50]; // 记下最大的上一个的那个 struct TrieNode
{
TrieNode *next[26];
int id;
}T[30*maxn],*Trie;
int trietop;
void insert(char *s,int idx)
{
int len=strlen(s);TrieNode *p=Trie;
for(int i=0;i<len;++i){
if(p->next[s[i]-'a']!=NULL){
p=p->next[s[i]-'a'];
}
else{
memset(T[trietop].next,0,sizeof(T[trietop].next));T[trietop].id=-1;
p->next[s[i]-'a']=&T[trietop++];
p=p->next[s[i]-'a'];
}
}
p->id=idx;
}
int find(char *s)
{
int len=strlen(s);TrieNode *p=Trie;
for(int i=0;i<len;++i){
if(p->next[s[i]-'a']!=NULL){
p=p->next[s[i]-'a'];
}
else{
return -1;
}
}
return p->id;
} int query(char *s)
{
char tmp[25];int len=strlen(s);int cnt=0;
int ret=-1,maxd=-1;
for(int i=0;i<len;++i){
cnt=0;
for(int j=0;j<len;++j){
if(i!=j) tmp[cnt++]=s[j];
}
tmp[cnt]='\0';
int tret=find(tmp);
if(tret!=-1&&d[tret]>maxd){
ret=str[tret].id;
maxd=d[tret];
}
}
return ret;
} void print(int x)
{
if(prevv[x]!=-1){
print(prevv[x]);
}
printf("%s\n",str[x].s);
} int main()
{
trietop=0;memset(T[trietop].next,0,sizeof(T[trietop].next));T[trietop].id=-1;Trie=&T[trietop++];
int n=0;char ins[25];memset(prevv,-1,sizeof(prevv));
while(scanf("%s",ins)!=EOF)
{
strcpy(str[n].sd,ins);
strcpy(str[n].s,ins);
sort(str[n].sd,str[n].sd+strlen(str[n].sd));
++n;
}
sort(str,str+n);for(int i=0;i<n;++i) str[i].id=i;
insert(str[0].sd,0);d[0]=0; int maxid=0,maxdist=0;
for(int i=1;i<n;++i){
int px=query(str[i].sd);
if(px!=-1){
d[i]=d[px]+1;prevv[i]=px;
if(d[i]>maxdist){
maxid=i;
maxdist=d[i];
}
}
else {
d[i]=0;
}
insert(str[i].sd,i);
}
print(maxid);
return 0;
}
POJ2004 Mix and build Trie树? dp?的更多相关文章
- LA-3942(trie树+dp)
题意: 给出一个由多个不同单词组成的字典,和一个长字符串,把这个字符串分解成若干个单词的连接,问有多少种方法; 思路: dp[i]表示s[i,L]的方案数,d[i]=∑d[j];s[i,j-1]是一个 ...
- NBUT 1222 English Game(trie树+DP)
[1222] English Game 时间限制: 1000 ms 内存限制: 131072 K 问题描写叙述 This English game is a simple English words ...
- Remember the Word,LA3942(Trie树+DP)
Trie树基础题,记录下代码. #include <cstdio> #include <cstring> #define MaxNode 4005*100 #define No ...
- BZOJ1212[HNOI2004]L语言——trie树+DP
题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的 ...
- hdu4843(NOI2000) 古城之谜 (trie树+DP)
Description 著名的考古学家石教授在云梦高原上发现了一处古代城市遗址.让教授欣喜的是在这个他称为冰峰城(Ice-Peak City)的城市中有12块巨大石碑,上面刻着用某种文字书写的资料,他 ...
- 【10.29校内测试】【线段树】【DP】【二进制Trie树求最小值最大】
Solution 标程太暴力惹QAQ 相当于是26棵线段树的说QAQ 不过我写了另一种写法,从大到小枚举每一个字母,标记字典序在这个字母之上的位置为1,每次都建一棵线段树,维护1的数量,即区间和. 修 ...
- Codeforces 615C Running Track(DP + Trie树)
题目大概说给两个串,问最少要用多少个第一个串的子串(可以翻转)拼成第二个串. UVa1401,一个道理..dp[i]表示前缀i拼接成功所需最少的子串,利用第一个串所有子串建立的Trie树往前枚举转移. ...
- UVa1401 Remember the Word(DP+Trie树)
题目给定一个字符串集合有几种方式拼成一个字符串. dp[i]表示stri...strlen-1的方案数 dp[len]=1 dp[i]=∑dp[j](stri...strj-1∈SET) 用集合的字符 ...
- Mix and Build(简单DP)
Mix and Build Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3936 Accepted: 1203 Case Ti ...
随机推荐
- NOIP 2015普及组复赛Day1 T1 == Codevs4510 神奇的幻方
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description: 幻方是一种很神奇的N∗N矩阵:它由数字 1,2,3, … … ,N∗N构成, ...
- 《shell下sort排序命令的使用》
首先建立一个文件,很乱,没有规律: 正排序: 倒排序: Uniq 删除文件中的重复行:用此命令要先对文件进行排序. 对文件冗余,只要文件所有重复的字符显示一次: 显示1-7,不重复的行: 只显示1-7 ...
- 《自动共享LDAP用户并且访问其家目录》RHEL6
实验的目的: 实现ldap服务器上的ldap用户被客户端访问,自动挂载到客户端,并且可以访问ldap用户的家目录. 服务端: 1.只需要配置文件: Iptables –F 关闭selinu ...
- Java HttpURLConnection 抓取网页内容 解析gzip格式输入流数据并转换为String格式字符串
最近GFW为了刷存在感,搞得大家是头晕眼花,修改hosts 几乎成了每日必备工作. 索性写了一个小程序,给办公室的同事们分享,其中有个内容 就是抓取网络上的hosts,废了一些周折. 我是在一个博客上 ...
- silverlight视频、音频
几天发现MediaElement播放不了wav格式的音频文件,在网上找到一篇解决的文章: http://www.cnblogs.com/rupeng/archive/2011/02/20/195936 ...
- Nginx+Keepalived实现高可用站点
Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat. corosync.pacemaker.但是它一般不会单独出现,而是与 ...
- sql server 查询多个不关联表且对结果编号
1.除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图.内联函数.派生表.子查询和公用表表达式中无效. 解决方法:top 100 percent * 2.如何对查询结果编 ...
- DirectoryEntry配置IIS出现ADSI Error:未知错误(0x80005000)
目录 问题案例 原因分析 解决问题 总结 问题案例 DirectoryEntry配置IIS,在IIS6.0下运转正常,但IIS7.0下运转会出错: System.DirectoryServices.D ...
- Python开发【第一篇】Python基础之反射
反射 反射的作用:反射得作用是提高代码可读行. __import__导入模块和import导入模块的区别: __import__导入模块是通过字符串进行导入. import是常用得导入模块方法. 扩展 ...
- 每日一“酷”之bisect
作用:维护有序列表,而不必在每次想列表增加一个元素时调用sort排序 bisect 模块实现了一个算法用于向列表中插入元素,同时仍保持列表有序.有些情况下,这比反复对一个了表序列更高效,另外也比构建一 ...