前言 C++题解
13分的原因就是这道题有两个样例违禁词中含有替换词的子串,赛后想了一下最简单的处理方式是用其他的词来代替违禁词然后再用替换词把这个违禁词换掉,试了一下这个想法是可以的15分没问题;但是这种就是一种并不完全对的题解,完全的题解太麻烦了,L1的题2分说实话不值得了这么拿(大佬当我没说)
题面
你的工作是实现一个审查内容的代码,用于对 AI 生成的内容的初步审定。更具体地说,你会得到一段由大小写字母、数字、空格及 ASCII 码范围内的标点符号的文字,以及若干个违禁词以及警告阈值,你需要首先检查内容里有多少违禁词,如果少于阈值个,则简单地将违禁词替换为;如果大于等于阈值个,则直接输出一段警告并输出有几个违禁词。(备注:没用的题面我就删掉了)
输入格式:
输入第一行是一个正整数 N (1≤N≤100),表示违禁词的数量。接下来的 N 行,每行一个长度不超过 10 的、只包含大小写字母、数字及 ASCII 码范围内的标点符号的单词,表示应当屏蔽的违禁词。
然后的一行是一个非负整数 k (0≤k≤100),表示违禁词的阈值。
最后是一行不超过 5000 个字符的字符串,表示需要检查的文字。
从左到右处理文本,违禁词则按照输入顺序依次处理;对于有重叠的情况,无论计数还是替换,查找完成后从违禁词末尾继续处理。
输出格式:
如果违禁词数量小于阈值,则输出替换后的文本;否则先输出一行一个数字,表示违禁词的数量,然后输出 H e X i e N i Q u a n J i a ! He Xie Ni Quan Jia! HeXieNiQuanJia!
代码
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;;
int n, k, cnt; // cnt记录数量
vector<string> s; // 记录违禁词
string t, r = "<censored>", c, w = "*-*-*-*-*-*"; // r原本的替换词,w新的替换词,c用来读换行符
void solve()
{
cin >> n;
getline(cin, c); //读换行符,getchar也可以
// 初始化违禁词,没什么好说的
for (int i = 0; i < n; i ++ ) {
getline(cin, t);
s.push_back(t);
}
cin >> k;
t.clear();
getline(cin, c); // 读换行符,用getchar也可以
getline(cin, t); // 读入要检查的字符串
// 查找违禁词然后替换成w
for (int i = 0; i < n; i ++ ) {
int f = 0;
while (f < t.size()) {
f = t.find(s[i], f);
if (f >= t.size()) break;
cnt ++ ;
t.replace(f, s[i].size(), w);
f += w.size();
}
}
// 这里如果违禁词超出阈值就直接输出cnt和警告
if (cnt >= k) {
cout << cnt << endl;
cout << "He Xie Ni Quan Jia!" << endl;
return;
}
// 查找w,替换成r
int f = 0;
while (f < t.size()) {
f = t.find(w, f);
if (f >= t.size()) break;
t.replace(f, w.size(), r);
f += r.size();
}
cout << t << endl;
}
int main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
solve();
return 0;
}
最后碎碎念一下,c++的replace为什么只能替换一个……,会Python的同学可以用一下Python应该很简单就可以秒了