题目主要围绕对输入的字符串进行处理,包括读取包含违禁词的文本字符串,在该字符串中查找并统计特定的违禁词出现的次数,以及根据违禁词出现的次数对字符串进行不同方式的修改和输出。例如,将违禁词替换为特定的字符串,这些操作都涉及到对字符串的各种操作和处理技巧。
输入样例
5
MaoNiang
SeQing
BaoLi
WeiGui
BuHeShi
4
BianCheng MaoNiang ba! WeiGui De Hua Ye Keyi Shuo! BuYao BaoLi NeiRong.
输出样例
BianCheng <censored> ba! <censored> De Hua Ye Keyi Shuo! BuYao <censored> NeiRong.
输入样例2
5
MaoNiang
SeQing
BaoLi
WeiGui
BuHeShi
3
BianCheng MaoNiang ba! WeiGui De Hua Ye Keyi Shuo! BuYao BaoLi NeiRong.
输出样例2
3
He Xie Ni Quan Jia!
算法思路
- 输入处理
- 读取违禁词列表:
- 首先从标准输入读取一个整数
n
,它代表违禁词的数量。 - 接着使用
vector<string>
容器banned
来存储这些违禁词,通过循环n
次,依次将每个违禁词读入到banned
向量中。
- 首先从标准输入读取一个整数
- 读取阈值和待处理文本:
- 读取一个整数
k
,它是判断是否进行严格处理的阈值。 - 使用
cin.ignore()
忽略上一次输入时可能残留的换行符,避免影响后续读取。 - 然后使用
getline(cin, text)
读取一整行文本,这行文本就是需要进行违禁词检测和替换的目标文本。
- 读取一个整数
2. 违禁词检测与替换
- 初始化:
- 初始化一个计数器
count
为 0,用于记录文本中出现的违禁词总数。 - 把
text
赋值给result
,后续的替换操作将在result
上进行,以保证原始text
内容不变。
- 初始化一个计数器
- 遍历违禁词列表:
- 对于
banned
向量中的每个违禁词word
,使用while
循环结合result.find(word, pos)
方法来查找word
在result
中的位置。pos
是查找的起始位置,初始化为 0。 - 当
find
方法返回的位置不是string::npos
表示找到了违禁词)时,执行以下操作:count
加 1,表示检测到一个违禁词。- 使用
result.replace(pos, word.length(), "___")
将找到的违禁词替换为"___"
。 pos
加上 3,即移动到替换后的"___"
之后的位置,继续查找下一个可能出现的该违禁词。
- 对于
3. 结果判断与输出
- 当违禁词数量小于阈值:
- 如果
count < k
,说明文本中的违禁词数量较少,需要进一步将"___"
替换为"<censored>"
。同样使用while
循环结合result.find("___", pos)
查找"___"
的位置。 - 找到后,使用
result.replace(pos, 3, "<censored>")
进行替换,然后pos
加上 10,移动到替换后的"<censored>"
之后的位置继续查找。 - 最后输出处理后的
result
文本。
- 如果
- 当违禁词数量大于等于阈值:
- 如果
count >= k
,说明文本中的违禁词数量较多,此时输出count
的值,然后输出"He Xie Ni Quan Jia!"
。
- 如果
代码示例
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main(){
int n;
cin>>n;
vector<string> banned(n);//创建字符串向量,存储输入的违禁词
for(int i=0;i<n;i++){
cin>>banned[i];
}
int k;
cin>>k;
cin.ignore();//忽略上一次输入,避免影响后续读取文本
string text;
getline(cin,text);//用getline读取一整行文本
//统计违禁词的数量并进行替换
int count=0;
string result=text;
//遍历存储所有违禁词的向量
for(const string& word : banned){
size_t pos=0;
while((pos=result.find(word,pos)) != string::npos){
count++;
result.replace(pos,word.length(),"___");
pos += 3;//移动到替换后的位置
}
}
if(count < k){
size_t pos=0;
while((pos = result.find("___",pos)) != string::npos){
result.replace(pos,3,"<censored>");
pos += 10;//移动到替换后的位置之后
}
cout<<result<<endl;
}
else{
cout<<count<<endl;
cout<<"He Xie Ni Quan Jia!"<<endl;
}
return 0;
}