0
点赞
收藏
分享

微信扫一扫

P2264 情书

犹大之窗 2022-03-14 阅读 49

链接:情书 - 洛谷

题目背景

一封好的情书需要撰写人全身心的投入。CYY同学看上了可爱的c**想对她表白,但却不知道自己写的情书是否能感动她,现在他带着情书请你来帮助他。

题目描述

为了帮助CYY,我们定义一个量化情书好坏的标准感动值。判断感动值的方法如下:

  1. 在情书的一句话中若含有给定词汇列表中的特定单词,则感动值加1,但每一单词在同一句话中出现多次感动值不叠加,不同单词不受影响。保证输入的单词不重复。
  2. 每句话以英文句号定界。
  3. 全文不区分大小写。

输入格式

第一行包含一个数字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;
}


//考虑边界了?
//考虑特殊情况?
//考虑输出中间值勘误?
举报

相关推荐

0 条评论