AC日记——接龙游戏 codevs 1051
1051 接龙游戏
给出了N个单词,已经按长度排好了序。如果某单词i是某单词j的前缀,i->j算一次接龙(两个相同的单词不能算接龙)。
你的任务是:对于输入的单词,找出最长的龙。
第一行为N(1<=N<=105)。以下N行每行一个单词(由小写组成),已经按长度排序。(每个单词长度<50)
仅一个数,为最长的龙的长度。
5
i
a
int
able
inter
3
1<=N<=105
思路:
用hash表把所有的单词给存起来
然后比较的时候用hash表比较
然后线性结构比较是否为前缀的复杂度为n^2
然而n<=100000
超时稳稳的
那,如何优化呢?
考虑把线性比较转化成树
建立一个根节点
我们从根节点找这个单词的前缀
如果没有这个单词的前缀
则把这个单词作为一个叶节点生长在根节点上
如果找到了
则跳入这个叶节点
继续从这个叶节点找前缀
直到找不到,然后把这个单词作为一个新的叶节点生长在当前节点上
这样会优化很多很多
轻松ac
来,上代码:
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream> #define mod 10000007 using namespace std; struct node {
int from,to,dis,next;
};
struct node edge[]; int n,len[],hash[][],dp[];
int head[],num,ans=; string word[]; inline void edge_add(int from,int to)
{
num++;
edge[num].to=to;
edge[num].from=from;
edge[num].next=head[from];
head[from]=num;
} void dfs(int now,int pos,int be)
{
ans=max(now,ans);
for(int i=head[be];i;i=edge[i].next)
{
if(len[edge[i].to]<len[pos])
{
if(hash[edge[i].to][len[edge[i].to]-]==hash[pos][len[edge[i].to]-])
{
dfs(now+,pos,edge[i].to);
return ;
}
}
}
edge_add(be,pos);
} int main()
{
len[]=;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
dp[i]=;
cin>>word[i];
len[i]=word[i].length();
for(int j=;j<len[i];j++)
{
hash[i][j]=word[i][j]-'a'+;
if(j) hash[i][j]+=(hash[i][j-]*)%mod;
hash[i][j]%=mod;
}
dfs(,i,);
}
cout<<ans<<endl;
return ;
}
AC日记——接龙游戏 codevs 1051的更多相关文章
- AC日记——地鼠游戏 codevs 1052
1052 地鼠游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 王钢是一名学习成绩优异的学生,在平 ...
- AC日记——最优贸易 codevs 1173
题目描述 Description [问题描述]C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路 ...
- AC日记——鬼谷子的钱袋 codevs 2998
2998 鬼谷子的钱袋 2006年省队选拔赛湖南 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 鬼谷子非常聪明,正 ...
- AC日记——舒适的路线 codevs 1001 (并查集+乱搞)
1001 舒适的路线 2006年 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description Z小镇是 ...
- AC日记——逃跑的拉尔夫 codevs 1026 (搜索)
1026 逃跑的拉尔夫 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 年轻的拉尔夫开玩笑地从一 ...
- AC日记——自然数和分解 codevs 2549
自然数和分解 思路: 水题: 代码: #include <bits/stdc++.h> using namespace std; ][]; int main() { cin>> ...
- AC日记——郁闷的出纳员 codevs 1286
郁闷的出纳员 思路: 设工资下限为ko,然后ko--(因为要小于工资下限): 设cur为记录工资增长,降低: 设第i个人的工资为pos: 对应的四种操作: 插入:cur-pos-ko: 增长:cur- ...
- AC日记——营业额统计 1296 codevs
1296 营业额统计 2002年 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description Tiger ...
- AC日记——花店橱窗布置 codevs 1028
题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学效果.为了取得最佳的美学效果,必须使花的摆放取得最大的 ...
随机推荐
- ae开发基础功能
放大.缩小.pan.框选要素(新建命令,建立命令HOOK,赋给当前地图控件): ICommand cmd = new ControlsSelectFeaturesTool(); cmd.OnCreat ...
- ubuntu制作本地源
背景 平时apt-get install安装软件时,下载的deb文件都会存放在/var/cache/apt/archives/下,为了今后重装或给别人用,特别是没有网络时,这些deb文件实际上是可以派 ...
- Android 视频播放器切换到下个视频时残留上个视频画面的解决办法
最近在做一个Android视频播放器,遇到一个问题:切换到下一个视频时,中间会停留上一个视频的残存画面. 这是怎么回事? 我在网上找了很多资料,终于找到了原因:我是用自定义一个surfacev ...
- Android 常见对话框
1.对话框通知(Dialog Notification) 当你的应用需要显示一个进度条或需要用户对信息进行确认时,可以使用对话框来完成. 下面代码将打开一个如图所示的对话框: public void ...
- Android C代码回调java方法
本文将讲述下列三种C代码回调java方法 1.c代码回调java空方法 2.c代码回调java int类型参数方法 3.c代码回调javaString类型参数方法 方法都差不多,先看c代码回调java ...
- 内存管理范围和@property
管理范围: 管理任何继承NSObject的对象,对其他的基本数据类型无 效 本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于 栈中,而对象存储于堆中,当代码块结束时这个 ...
- [读书笔记] Head First 设计模式
OO基础 抽象 封装 多态 继承 OO原则 原则 描述 封装变化 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混合在一起. 把会变化的部分取出来并“封装”起来,好让其他部分不 ...
- 用Objective-C写了一个简单的批量更改文件名的程序
前言:因为本人要高仿一个app,从app中解压asserts得到的所有图片文件,文件名都带有~iPhone这个干扰的名字,为了去除这个~iPhone这个字符串,所以本人写了个简答的批量更改所有文件名的 ...
- teiid入门
teiid,是jboss组件中进行数据虚拟化的部件(data virtualization).但是对teiid的介绍比较少,这里记录一下我的学习过程. 一.编译安装teiid teiid的安装,可以选 ...
- JMS(Java消息服务)入门教程
什么是Java消息服务 Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建.发送.读取消息等,用于支持JAVA应用程序开发.在J2EE中 ...