T1 P2264 情书
传送门:洛谷P2264
这道题需要注意几个关键点:
-
不管大小写,所以我们就把所有的英文字符都给改成大写或者小写;
-
' . ' 是一个句子的结束,相同的单词在不同的句子里都可以加分,我们要判断句子结束;
-
关键词判重,一个单词在一个句子里不能重复加分;
对于 ① 我们可以在小写字母上 \(-32\) 变成大写字母;
对于 ② 我们就找 ' . ' 就行了;
对于 ③ 我们用一个 \(vis[]\) 数组记录;
很简单的一个题;
贴代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100 + 5;
string a[maxn], s, sm;
int n, ans, len, vis[maxn];
void read() {
scanf("%d", &n);
for (int i = 1; i <= n; ++ i) {
cin >> a[i];
for (int j = 0; j < a[i].length(); ++ j)
if (a[i][j] >= 97 && a[i][j] <= 122) a[i][j] -= 32;
}
getchar();//一定要写;
getline(cin, s);//可以读入空格;
int len = s.length();
for (int i = 0; i < len; ++ i)
if (s[i] >= 97 && s[i] <= 122) s[i] -= 32;
for (int i = 0; i < len; ++ i) {
if (s[i] == ' ') {
for (int j = 1; j <= n; ++ j) {
if (!vis[j] && sm == a[j]) {
vis[j] = 1;
ans ++; break ;
}
}
sm = "";
}
else if (s[i] == ',') {
for (int j = 1; j <= n; ++ j) {
if (!vis[j] && sm == a[j]) {
vis[j] = 1;
ans ++; break ;
}
}
sm = "";
}
else if (s[i] == '.') {
for (int j = 1; j <= n; ++ j) {
if (!vis[j] && sm == a[j]) {
vis[j] = 1;
ans ++; break ;
}
}
sm = "";
memset(vis, 0, sizeof vis);
}
else sm += s[i];//记录单词
}
// cout << s << endl;
printf("%d\n", ans);
}
int main() {
read();
return 0;
}