情 书 情书 情书
题目链接: 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,但每一单词在同一句话中出现多次感动值不叠加,不同单词不受影响。保证输入的单词不重复。
- 每句话以英文句号定界。
- 全文不区分大小写。
输入
第一行包含一个数字 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 1≤n≤100,每个单词不超过 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;
}