洛谷P2264 情书

题面

给出n代表特殊词汇的数量 ( 1 < = n < = 100 ) (1<=n<=100) ,然后给出n个单词。最后一行给出一个句子,包含空格,逗号,句号,句号分隔表示是不同的句子。
句子中出现特殊词汇(词汇意义同英语,如your不算出现了you)能加分,但同一个句子一种词最多加一分。
单词和句子不区分大小写。

分析

类似匹配问题,但这题的难点不在于匹配而在于处理句子以及挖出句子中的每一个词。
如这个点

1
SB
Yuno is S B. Yuno is SB. Yuno is SB SB. Yuno is SB,SB. Yuno is SB.SB.

分隔的S B不符合匹配原则,第三句话中出现了两次特殊词,但只记录一次,最后一句话作为单独的句子只含特殊词。

其实用标点符号分隔,挖掘出子串就ok了

读入有坑,n个词语之后可能包含什么奇特的标点符号,如果直接对最后一行getline会读空(然后爆0),两次getline才能读到最后那行。

匹配相同单词可以使用逐字匹配,或者string的==,或者哈希。这里为了练习unordered_map用了它的哈希。
unordered_map类似map,能保证相同的特殊词读入后仍然只计一次,同时又能给每个词提供一个不同的标号,用类似数组的办法取出

代码

#include "cstdlib"
#include <iostream>
#include <stdio.h>
#include <string.h>
#include<algorithm>
#include<unordered_map>
#include <string>
using namespace std;
unordered_map<string, int>um;
int arr[105];
int main()
{
	ios::sync_with_stdio(false);
	int n,ans=0;
	cin >> n;
	string str;
	for (int i = 0; i < n; i++)
	{
		cin >> str;
		for (int j = 0; j < str.size(); j++)
		{
			if (str[j] <= 'Z' && str[j] >= 'A')str[j] += 32;//大写转小写
		}
		um.insert(make_pair(str,i));//加入特殊词,用um[str]可取出这个str对应的数值(存在的情况下,
		//不存在会抛出异常)
	}
	str.clear();
	getline(cin, str);
	getline(cin, str);
	int size = str.size();
	for (int i = 0; i < size; i++)
	{
		if (str[i] == ',')str[i] =' ';
		if (str[i] <= 'Z'&&str[i]>='A')str[i] += 32;//大写转小写
	}
	for (int i = 0,j=0; i < size; i++)
	{
		while (j < size && (str[j] == ' '||str[j]=='.'))j++;
		if ((str[i] == ' '||str[i]=='.')&&i>j) {//[j,i)可截出单词
			if (um.find(str.substr(j, i-j)) != um.end()&&arr[um[str.substr(j, i-j)]]!=1) {
				arr[um[str.substr(j, i-j)]] = 1;
				ans += 1;
			}
			if (str[i] == '.')memset(arr, 0, 105 * sizeof(int));
			j = i;
		}
	}
	cout << ans;
	return 0;
}
发布了32 篇原创文章 · 获赞 0 · 访问量 1196

猜你喜欢

转载自blog.csdn.net/engineoid/article/details/104169243