(hnust 1601)名字缩写(map存储前缀)
2017-08-15 09:57
381 查看
时间限制: 1 Sec 内存限制: 128 MB
提交: 290 解决: 81
[提交][状态][讨论版]
题目描述
Noname老师有一个班的学生名字要写,但是他太懒了,想少写几个字母。很快他发现这是可行的,例如下面的学生名单:
Davidson
Davis
Dixon
Smith
可以缩写为
David
Davis
Di
S
David 指明Davidson外,不可能是其他三位同学名字的前缀。S仅能代表Smith。在确保能无歧义指明同学的前提下,Noname老师总是希望使用最少的字母。
输入
给定一系列名字,每个名字一行(不超过100行),名字仅含英文字母,名字长度不超过40,这些名字按字母升序排列, 任意两个名字不相同而且一个名字不会正好是另一个名字的前缀。
输出
每行输入对应一行输出,内容为空格分开原来的名字和缩写后的名字。
样例输入
Adams
Andersen
Anderson
Carson
Carter
Carville
Cooper
Coply
Smith
Smythe
Sorensen
Sorenson
Wynn
样例输出
Adams Ad
Andersen Anderse
Anderson Anderso
Carson Cars
Carter Cart
Carville Carv
Cooper Coo
Coply Cop
Smith Smi
Smythe Smy
Sorensen Sorense
Sorenson Sorenso
Wynn W
提示
来源
2014湖南科技大学校赛
分析:看到这个直接想着暴力,但是要求输出名字的前缀且不会重复,那么联系到以前的一个题,直接用map存储所有前缀,然后检验是否出现过,没有的话就直接输出。
需要注意的是只有一个名字的时候,错了一次,因为我写的map存储,存储的第一个字符串是空串,稍微改一点就行了
提交: 290 解决: 81
[提交][状态][讨论版]
题目描述
Noname老师有一个班的学生名字要写,但是他太懒了,想少写几个字母。很快他发现这是可行的,例如下面的学生名单:
Davidson
Davis
Dixon
Smith
可以缩写为
David
Davis
Di
S
David 指明Davidson外,不可能是其他三位同学名字的前缀。S仅能代表Smith。在确保能无歧义指明同学的前提下,Noname老师总是希望使用最少的字母。
输入
给定一系列名字,每个名字一行(不超过100行),名字仅含英文字母,名字长度不超过40,这些名字按字母升序排列, 任意两个名字不相同而且一个名字不会正好是另一个名字的前缀。
输出
每行输入对应一行输出,内容为空格分开原来的名字和缩写后的名字。
样例输入
Adams
Andersen
Anderson
Carson
Carter
Carville
Cooper
Coply
Smith
Smythe
Sorensen
Sorenson
Wynn
样例输出
Adams Ad
Andersen Anderse
Anderson Anderso
Carson Cars
Carter Cart
Carville Carv
Cooper Coo
Coply Cop
Smith Smi
Smythe Smy
Sorensen Sorense
Sorenson Sorenso
Wynn W
提示
来源
2014湖南科技大学校赛
分析:看到这个直接想着暴力,但是要求输出名字的前缀且不会重复,那么联系到以前的一个题,直接用map存储所有前缀,然后检验是否出现过,没有的话就直接输出。
需要注意的是只有一个名字的时候,错了一次,因为我写的map存储,存储的第一个字符串是空串,稍微改一点就行了
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<string> #include<map> using namespace std; #define mem(a,n) memset(a,n,sizeof(a)) const int INF=0x3f3f3f3f; const int N=10; map<string,int>mp; int n; char str[105][45]; bool check(char *s,string str) { for(int i=0,j=0;i<str.length();i++,j++) if(str[i]!=s[j]) return false; return true; } void solve() { map<string,int>::iterator it=mp.begin(); int i=0; for(it++;it!=mp.end();it++)///因为map存储的第一个字符串是空串,把这里的迭代器+1就可以 了 { if(i==n) break; if(it->second==1&&check(str[i],it->first)) cout<<str[i++]<<" "<<it->first<<"\n"; } } int main() { n=0; while(scanf("%s",str )!=EOF) { int len=strlen(str ); for(int i=0;i<len;i++) { char ch=str [i]; str [i]='\0'; mp[(string)str ]++; str [i]=ch; } mp[(string)str ]++; n++; } solve(); return 0; }
相关文章推荐
- 1601: 名字缩写
- HNUSTOJ 1601:名字缩写
- java 把一个大list分成N个小list,然后用map存储的小方法
- 使用系统表根据存储过程名字生成ADO.NET数据库访问代码
- 输入孩子的姓名, 用map存储,&…
- Oracle Coherence中文教程十三:实施存储和备份的Map
- 常用类及控件的名字缩写
- 来感受一下别人的密码,名字缩写什么的都弱爆了!
- Map集合在Spring域中的存储形式
- 2016"百度之星" - 测试赛 1003 IP聚合(Map存储)
- js 实现存储Map 结构的数据
- map存储到文件
- 数据存储——java中List与Map初始化的一些写法分享
- Android 默认AP名字,以及AP名字存储路径
- 18-Map集合-07-常用对象API(集合框架-Map集合-HashMap存储自定义对象)
- MapReduce 中如何处理HBase中的数据?如何读取HBase数据给Map?如何将结果存储到HBase中?
- 详解java调用存储过程并封装成map
- 容器第九课,数据存储综合练习,map保存表记录
- 存储集合元素的List转换为Map
- Codeforces 903D - Almost Difference 前缀和+map