情书

情 书 情书

题目链接: l u o g u   P 2264 luogu\ P2264 luogu P2264

题目背景

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

题目

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

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

输入

第一行包含一个数字 n n n,表示导致感动值提升的词汇列表中单词的数量,随后 n n n行是给定单词,每行一个。保证单词只包含英文字母。

最后一行为情书正文,保证只包含以下几种字符: 英文字母、数字、空格、英文逗号、英文句号。

输出

一个数字 g g g,表示情书带来的感动值。

样例输入

3
love
so
much
I love you so much.

样例输出

3

数据范围

对于所有的数据,保证 1 ≤ n ≤ 100 1 ≤ n ≤ 100 1n100,每个单词不超过 50 50 50字符,全文不超过 1000 1000 1000字符。

思路

这道题虽然是一道蓝题,但其实非常之好做,因为数据范围是在是太小了。
我们就直接字符串模拟, 按照要求就可以了。
不过要记得统一大小写。

(不过如果你想用 h a s h hash hash来做的话应该也可以吧)

代码

#include<cstdio>
#include<cstring>

using namespace std;

int n, ans, k;
char c, love[101][1001], letter[1001], word[1001];
bool use[101];

int main() {
	scanf("%d", &n);//读入
	
	for (int i = 1; i <= n; i++) {
		c = getchar();//处理换行符
		scanf("%s", &love[i]);//读入关键字
		for (int j = 0; j < strlen(love[i]); j++)
			if (love[i][j] >= 'a' && love[i][j] <= 'z')
			 love[i][j] = love[i][j] - ('a' - 'A');//把每一个关键字的所有小写部分全部转换成大写部分
	}
	
	c = getchar();//处理换行符
	gets(letter);//读入情书
	for (int i = 0; i < strlen(letter); i++) {
		if ((letter[i] >= '0' && letter[i] <= '9') || (letter[i] >= 'A' && letter[i] <= 'Z')) {
			word[k++] = letter[i];//是数字或者大写就直接加入词语中
			continue;
		}
		if (letter[i] >= 'a' && letter[i] <= 'z') {
			word[k++] = letter[i] - ('a' - 'A');//是小写就转成大写在加入词语中
			continue;
		}
		if (letter[i] == ' ' || letter[i] == ',' || letter[i] == '.') {//一个单词写完了
			for (int j = 1; j <= n; j++) {//枚举每一个关键词来匹配
				if (k != strlen(love[j])) continue;//长度不等,肯定不是
				bool yes = 0;
				for (int l = 0; l < k; l++) {
					if (word[l] != love[j][l]) {//有一个地方和关键词不一样
						yes = 1;//标记不行
						break;//直接退出
					}
				}
				if (!yes && !use[j]) {//如果是这个关键词
					use[j] = 1;//记录这个单词已经用过
					ans++;//答案加一
				}
			}
			k = 0;//初始化
			if (letter[i] == '.') {//如果一句话讲完了
				memset(use, 0, sizeof(use));//关键词次数全部清零
				continue;
			}
		}
	}
	
	printf("%d", ans);//输出
	
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值