I-最短的名字
在一个奇怪的村子中,很多人的名字都很长,比如aaaaa, bbb and abababab。
名字这么长,叫全名显然起来很不方便。所以村民之间一般只叫名字的前缀。比如叫’aaaaa’的时候可以只叫’aaa’,因为没有第二个人名字的前三个字母是’aaa’。不过你不能叫’a’,因为有两个人的名字都以’a’开头。村里的人都很聪明,他们总是用最短的称呼叫人。输入保证村里不会有一个人的名字是另外一个人名字的前缀(作为推论,任意两个人的名字都不会相同)。
如果村里的某个人要叫所有人的名字(包括他自己),他一共会说多少个字母?
Input
输入第一行为数据组数T (T<=10)。每组数据第一行为一个整数n(1<=n<=1000),即村里的人数。以下n行每行为一个人的名字(仅有小写字母组成)。输入保证一个村里所有人名字的长度之和不超过1,000,000。
Output
对于每组数据,输出所有人名字的字母总数。
Sample Input
1
3
aaaaa
bbb
abababab
Sample Output
5
分析:
正确的解题姿势是字典树,但是题目的时间限制是5s,可以用map划船过去,这也是让我很不理解的事,为什么好多前缀后缀的题时间限制都那么长;
代码:
字典树:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<map>
using namespace std;
const int N = + ;
const int MaxSize = + ;
char name[N][N];
int ch[MaxSize][N];
int val[MaxSize],sz; int lx(char c){return c-'a';}
void Insert(char *str){
int len = strlen(str),u=,c;
for(int i=;i<len;i++){
c=lx(str[i]);
if(!ch[u][c]) ch[u][c] = sz++;
u = ch[u][c];
val[u]++;
}
}
int Query(char *str){
int len = strlen(str),u=,c;
for(int i=;i<len;i++){
c = lx(str[i]);
u = ch[u][c];
if(val[u] == ) return i+;
}
return ;
}
void Init(){
memset(ch,,sizeof(ch));
memset(val,,sizeof(val));
sz = ;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
Init();
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%s",name[i]);
Insert(name[i]);
}
int sum=;
for(int i=;i<n;i++) sum+=Query(name[i]);
printf("%d\n",sum);
}
}
map:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<map>
using namespace std;
const int N = + ; char name[N][N];
map<string,int> mp;
void Insert(char *str){
int len = strlen(str);
for(int i=;i<=len;i++){
char c = str[i];
str[i] = '\0';
mp[str]++;
str[i] = c;
}
}
int Query(char *str){
int len = strlen(str);
for(int i=;i<=len;i++){
char c = str[i];
str[i] = '\0';
if(mp[str] == ) return i;
str[i] = c;
}
}
int main(){
int T;
string str;
scanf("%d",&T);
while(T--){
int n;
mp.clear();
scanf("%d",&n);
for(int i=;i<n;i++){
cin >> name[i];
Insert(name[i]);
}
int sum = ;
for(int i=;i<n;i++) sum += Query(name[i]);
printf("%d\n",sum);
}
}
I-最短的名字的更多相关文章
- csuoj 1115: 最短的名字
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1115 1115: 最短的名字 Time Limit: 5 Sec Memory Limit: 6 ...
- CSU 1115 最短的名字
传送门 Time Limit: 5000MS Memory Limit: 65536KB 64bit IO Format: %lld & %llu Description 在一个奇怪的 ...
- E - 最短的名字
Description 在一个奇怪的村子中,很多人的名字都很长,比如aaaaa, bbb and abababab. 名字这么长,叫全名显然起来很不方便.所以村民之间一般只叫名字的前缀.比如叫'aaa ...
- CSU - 1115 最短的名字(字典树模板题)
Description 在一个奇怪的村子中,很多人的名字都很长,比如aaaaa, bbb and abababab. 名字这么长,叫全名显然起来很不方便.所以村民之间一般只叫名字的前缀.比如叫'aaa ...
- Trie/最短的名字
题目链接 /* 简单trie树的应用,注意在初始化的时候要把cnt也初始化,不然,WA! 下面的四分代码各有特点 */ //数组型,名字查询. #include<cstdio> #incl ...
- 2012年湖南省程序设计竞赛E题 最短的名字
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1115 解题报告:输入n个字符串,让你求出可以用来区别这些字符串的最少的前缀总共有多少个字 ...
- LINQ之路 7:子查询、创建策略和数据转换
在前面的系列中,我们已经讨论了LINQ简单查询的大部分特性,了解了LINQ的支持计术和语法形式.至此,我们应该可以创建出大部分相对简单的LINQ查询.在本篇中,除了对前面的知识做个简单的总结,还会介绍 ...
- LINQ 学习笔记(1)
学习资源参考 : http://www.cnblogs.com/lifepoem/archive/2011/12/16/2288017.html 常用方法是 Where, OrderBy, Selec ...
- 组织Golang代码
本月初golang官方blog(需要自己搭梯子)上发布了一篇文章,简要介绍了近几个月Go在一 些技术会议上(比如Google I/O.Gopher SummerFest等)的主题分享并伴有slide链 ...
- Lambda语句的嵌套
// 获取所有长度最短的名字(注意:可能有多个) string[] names = { "Tom", "Dick", "Harry", &q ...
随机推荐
- ansible-乱
工作机制:ssh 无客户端 工作方式: 1,CMDB 2,公有云私有云API 3,使用ad-hoc 4,ansible-playbook ansible 执行命令,底层调用传输连接模块,将命令或文件传 ...
- 如何查看运行的docker container 的 执行 docker run的命令
前言 就是我备份了一下 mysql_container, 然后我想启用 新的备份的mysql_container 但是之前的docker run image xxxxxx这些都已经忘记了 我想找一下之 ...
- Selenium 详解xpath定位
xpath定位在业界被戏称为元素定位的"屠龙宝刀",宝刀在手,武林我有.现在我们就来详解xpath定位方法. 一.xpath通过元素属性定位 xpath可以通过元素的属性来定位,如 ...
- 关于MySQL 中 EXISTS 的用法
在MySQL中 EXISTS 和 IN 的用法有什么关系和区别呢? 假定数据库中有两个表 分别为 表 a 和表 b create table a ( a_id int, a_name varchar( ...
- springboot 基于@Scheduled注解 实现定时任务
前言 使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式: 一.基于注解(@Scheduled) 二.基于接口(SchedulingConfigurer) 前者相信大家都很熟悉, ...
- 为什么电脑连接不上FTP
我们对服务器的FTP状况有实时监控,一般问题都不在服务器端. 而且我们客服一般会第一时间测试下您空间FTP是否真的不能连接 99%绝大部分FTP连接不上的问题,都是客户那边的软件端或网络问题. 问题分 ...
- 后盾网lavarel视频项目---lavarel中间件(使用中间件拦截没登录的用户)
后盾网lavarel视频项目---lavarel中间件(使用中间件拦截没登录的用户) 一.总结 一句话总结: 1.中间件中验证用户是否登录:if(!Auth::guard('admin')->c ...
- $_SERVER 中HTTP_HOST 和 SERVER_NAME
本来打算获取当前页面的url的 拼接时发现 $_SERVER['SERVER_NAME'] 并不是当前的url链接 打印整个$_SERVER 发现 [SERVER_NAME] => lvs ...
- lr中用C语言比较两个字符串变量
以下脚本,定义两个一样的字符数组,对比后,打印出result的值: Action() { int result; char string1[] = "We can see the strin ...
- centos设置定时删除文件定时清理网站日志
1.进入linux系统 2.在任意目录创建一个sh后缀的文件,如: 3.编辑打开该文件,如图: 4.此时按键盘上的“i”键或者“insert”键,进入编辑模式 输入: #!/bin/shfind /d ...