链接:情书 - 洛谷
题目背景
一封好的情书需要撰写人全身心的投入。CYY同学看上了可爱的c**想对她表白,但却不知道自己写的情书是否能感动她,现在他带着情书请你来帮助他。
题目描述
为了帮助CYY,我们定义一个量化情书好坏的标准感动值。判断感动值的方法如下:
- 在情书的一句话中若含有给定词汇列表中的特定单词,则感动值加1,但每一单词在同一句话中出现多次感动值不叠加,不同单词不受影响。保证输入的单词不重复。
- 每句话以英文句号定界。
- 全文不区分大小写。
输入格式
第一行包含一个数字n,表示导致感动值提升的词汇列表中单词的数量,随后n行是给定单词,每行一个。保证单词只包含英文字母。
最后一行为情书正文,保证只包含以下几种字符: 英文字母、数字、空格、英文逗号、英文句号。
输出格式
一个数字g,表示情书带来的感动值。
输入输出样例
输入 #1复制
3 love so much I love you so much.
输出 #1复制
3
说明/提示
对于所有的数据,保证1 ≤ n ≤ 100,每个单词不超过50字符,全文不超过1000字符。
学到了很多东西:1.读一长串东西分字节读入,并且只能用scanf,用了scanf就不能解绑了!!切记
2.如果单词和“.”同时出现,就不能用while(cin>>s)了
3.一些处理大小写的技巧
4.复原的技巧
Talk is cheap. Show me the code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x7fffffff
#define endl '\n'
map<string,int>mp;
string str[1005],s;//str:存放单词
int n,ans,cnt;
signed main(){
cin>>n;
for(int i=1;i<=n;i++) {
cin>>s;int len=s.size();
for(int i=0;i<len;i++) s[i]=tolower(s[i]);//将单词小写,并放入mp
mp[s]=1;
}
char a;
s="";//s:记录单词
while(~scanf("%c",&a)){
if(a>='A'&&a<='Z'){//一个字节的读
a=tolower(a);
s+=a;
}
else if(a>='a'&&a<='z'){
s+=a;
}
else {//读到一个单词
if(mp[s]==1){
ans++,cnt++;
str[cnt]=s;
mp[s]=0;//避免重复读入
}
s="";
}
if(a=='.'){//读完一句话
for(int i=1;i<=cnt;i++) mp[str[i]]=1;//复原mp
cnt=0;//重新读入
}
}
cout<<ans;
}
//考虑边界了?
//考虑特殊情况?
//考虑输出中间值勘误?