UVALive 6523 Languages
The Enterprise has encountered a planet that at one point had been inhabited. The only remnant from the prior civilization is a set of texts that was found. Using a small set of keywords found in various different languages, the Enterprise team is trying to determine what type of beings inhabited the planet.
Input
The first line of input will be N (1 ≤ N ≤ 100), the number of different known languages. The next N lines contain, in order, the name of the language, followed by one or more words in that language, separated with spaces. Following that will be a blank line. After that will be a series of lines, each in one language, for which you are to determine the appropriate language. Words consist of uninterrupted strings of upper or lowercase ASCII letters, apostrophes, or hyphens, as do the names of languages. No words will appear in more than one language. No line will be longer than 256 characters. There will be at most 1000 lines of sample text. Every sample text will contain at least one keyword from one of the languages. No sample text will contain keywords from multiple languages. The sample text may contain additional punctuation (commas, periods, exclamation points, semicolons, question marks, and parentheses) and spaces, all of which serve as delimiters separating keywords. Sample text may contain words that are not keywords for any specific language. Keywords should be matched in a case-insensitive manner.
Output
For each line of sample text that follows the blank line separating the defined languages, print a single line that identifies the language with which the sample text is associated.
Sample Input
4
Vulcan throks kilko-srashiv k’etwel
Romulan Tehca uckwazta Uhn Neemasta
Menk e’satta prah ra’sata
Russian sluchilos
Dif-tor heh, Spohkh. I’tah trai k’etwel
Uhn kan’aganna! Tehca zuhn ruga’noktan!
Sample Output
Vulcan
Romulan
Solution
注意Input里加粗的部分,我在这里WA了一发。
这题的输入是个坑。首先考虑如何读取Keywords,这可归结为读入一行内的若干字符串。
在本题中,一行输入可分为两部分:words(词), delimiters(定界符、分隔符)。
delimiters又分为两种:whitespace characters(空白字符), punctuations(标点)。
keywords部分的输入,delimiters不含puntuations。如果没有读入一行这个设定的话,
char s[]; scanf("%s", s);
就搞定了。加了这个限制,只要把每个word后面的delimiters也读入,看其中是否包含'\n'就好了:
char s[], delim[]; scanf("%s%[ \n]", s, delim);
这里有个地方要特别注意:
在Windows下换行符是'\n\r' (line feed + carriage return),此时按上面代码中的方式读取delimiters就不能读取/r,但Windows下的换行符并不总是'\n\r',也有只是'\n'的情况,可能跟文件的扩展名有关吧,这个问题我暂不清楚。我调试时是从无扩展名的文本文件in读入的,换行符是'\n',不知换成in.txt会如何。但无论如何
char s[], delim[]; scanf("%s%[ \n\r]", s, delim);
都能正确处理。
-------------------------------------------------------------------------------------------------------------
sample text的输入要多考虑punctuations,可如此处理:
char s[], delim[]; scanf("%*[,.!;() \n]"), scanf("%[^,.!;() \n]%[,.!;() \n]", s, delim);
这样写其实有点多余,下面Implementation里的第二份代码给出了另一种做法。
注意这里如果写成
char s[], delim[]; scanf("%*[,.!;() \n]%[^,.!;() \n]%[,.!;() \n]", s, delim);
就错了。(请考虑函数scanf()在什么情况下return)
Implementation
#include <bits/stdc++.h>
using namespace std;
const int N();
map<string, int> mp;
char lang[N][], s[], delim[];
string t; int main(){
int n;
scanf("%d", &n);
for(int i=; i<n; i++){
scanf("%s", lang[i]);
for(bool flag=false; !flag;){
scanf("%s%[ \n]", s, delim);
for(int i=; s[i]; i++)
s[i]=tolower(s[i]);
t=s;
mp[t]=i;
for(int i=; delim[i]; i++)
if(delim[i]=='\n'){
flag=true;
break;
}
}
} for(bool flag=false; scanf("%*[,.!;() \n]"), ~scanf("%[^,.!;() \n]%[,.!;() \n]", s, delim); ){
if(!flag){
for(int i=; s[i]; i++)
s[i]=tolower(s[i]);
t=s;
if(mp.find(t)!=mp.end()){
flag=true;
puts(lang[mp[t]]);
}
}
for(int i=; delim[i]; i++)
if(delim[i]=='\n'){
flag=false;
break;
}
}
}
#include <bits/stdc++.h>
using namespace std;
const int N();
map<string, int> mp;
char lang[N][], s[], delim[];
string t; int main(){
int n;
scanf("%d", &n);
for(int i=; i<n; i++){
scanf("%s", lang[i]);
for(bool flag=false; !flag;){
scanf("%s%[ \n]", s, delim);
for(int i=; s[i]; i++)
s[i]=tolower(s[i]);
t=s;
mp[t]=i;
for(int i=; delim[i]; i++)
if(delim[i]=='\n'){
flag=true;
break;
}
}
}
scanf("%*[,.!;() \n]");
for(bool flag=false; ~scanf("%[^,.!;() \n]%[,.!;() \n]", s, delim); ){
if(!flag){
for(int i=; s[i]; i++)
s[i]=tolower(s[i]);
t=s;
if(mp.find(t)!=mp.end()){
flag=true;
puts(lang[mp[t]]);
}
}
for(int i=; delim[i]; i++)
if(delim[i]=='\n'){
flag=false;
break;
}
}
}
UVALive 6523 Languages的更多相关文章
- UVALive - 4108 SKYLINE[线段树]
UVALive - 4108 SKYLINE Time Limit: 3000MS 64bit IO Format: %lld & %llu Submit Status uDebug ...
- UVALive - 3942 Remember the Word[树状数组]
UVALive - 3942 Remember the Word A potentiometer, or potmeter for short, is an electronic device wit ...
- UVALive - 3942 Remember the Word[Trie DP]
UVALive - 3942 Remember the Word Neal is very curious about combinatorial problems, and now here com ...
- PLoP(Pattern Languages of Programs,程序设计的模式语言)
2014/8/1 12:24:21潘加宇 http://www.umlchina.com/News/Content/340.htmPloP大会2014即将举行 PLoP(Pattern Languag ...
- Natural language style method declaration and usages in programming languages
More descriptive way to declare and use a method in programming languages At present, in most progra ...
- ECSHOP \admin\edit_languages.php GETSHELL Based On Injection PHP Code Into /languages/zh_cn/user.php
目录 . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 对于很多CMS网站来说,它们都需要保存很多的网站META信息,最常用的最佳实践是以 ...
- 思维 UVALive 3708 Graveyard
题目传送门 /* 题意:本来有n个雕塑,等间距的分布在圆周上,现在多了m个雕塑,问一共要移动多少距离: 思维题:认为一个雕塑不动,视为坐标0,其他点向最近的点移动,四舍五入判断,比例最后乘会10000 ...
- Scripting Languages
Computer Science An Overview _J. Glenn Brookshear _11th Edition A subset of the imperative programmi ...
- UVALive 6145 Version Controlled IDE(可持久化treap、rope)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
随机推荐
- awk 和 sed 使用案例
1.模仿wc的行为,统计一个文本文件的文件的字符数.行数.单词数. awk '{numOfChar+=length($0);numOfWord+=NF}END{print numOfChar" ...
- UOJ 151 斗地主“加强”版
#151. [NOIP2015]斗地主“加强”版 统计 描述 提交 自定义测试 本题开放Hack 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54 ...
- 什么是json
http://www.ruanyifeng.com/blog/2009/05/data_types_and_json.html http://edu.51cto.com/lesson/id-71123 ...
- 机器学习算法 Python & R速查表
- struct2cell
函数功能:把结构体转换为元胞数组. 语法格式: c = struct2cell(s) 如果s是m*n(m行n列)的二维的结构体数组,每个结构体含有p个域,则转换得到一个p*m*n的元胞数组c. 如果s ...
- Linux(12.1-12.6)学习笔记
第十二章 并发编程 如果逻辑控制流在时间上重叠,那么他们就是并发的.应用级并发在以下情况中发挥作用: 访问慢速I/O设备. 与人交互. 通过推迟工作以降低延迟. 服务多个网络客户端. 在多核机器上进行 ...
- 超全!iOS 面试题汇总
之前看了很多面试题,感觉要不是不够就是过于冗余,于是我将网上的一些面试题进行了删减和重排,现在分享给大家.(题目来源于网络,侵删) 1. Object-c的类可以多重继承么?可以实现多个接口么?Cat ...
- 34 Sources for Test Ideas
We recommend collecting test ideas continuously from a variety of information sources. Consider the ...
- WIN8 浏览器排版不兼容问题
经常访问网站失败 访问部分网站只显示白底蓝字没有排版也没有图片 尝试了网上的各种方法,也是用了360和百度安全管家的网页修复 重置了IE设置 都不行!!! 最后有效的方法是 更换DNS 208.67. ...
- 第五章:javascript:队列
队列是一种列表,不同的是队列只能在末尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据.先进先出.这点和栈不一样,在栈中,最后入栈的元素反被优先处理.可以将队列想象成银行排队办理业务的人,排队在 ...