文明的复兴
(words.pas/c/cpp/in/out)
Problem
战神Prince&Gush回归了,但许多原先的上层精灵越来越不安分。他们无法忍受失去权力的空虚感,开始重新寻找新的途径获取权利。他们直率急躁的领导人King_Bette开始公开抨击权威,并散布谣言。 权利的统治需要统一,需要强硬,被逼无奈下正义的领袖开始收缴反动的资料,清除世界的毒瘤,借以踏上快速发展之路。
不良信息指的是一组单词,每个单词均为不良信息。不良信息文本是指包含一系列的单词,且其中包含有不良信息。发布信息者经常在单词中加些字母以外的字符以搅乱正义的视线,于是Prince想请你为他写一个能够将这些不良信息屏蔽掉的工具。但是为了尽量降低误删率,他提出了下面一个要求:你只需要将字母完全匹配的单词屏蔽掉即可。
例如:
sex为不良信息时,sex8,sex$,se#x均为不良信息sexx 则不属于不良信息.
Input
第一行为一个正数k <= 10000,表示有k个需要被屏蔽的词语,均为小写字母。
以下k行每行一个单词。
最后一行为输入需要处理的文本(文本长度<=100000),单词与单词之间空格分开且所有字母为小写字母。
Output
输出一行和输入格式一致的文本,被屏蔽的单词的字母以*代替原字母。
Sample Input
1
sex
sex sex8 sex$ s&&ex sexx aaa bbb
Sample Output
*** ***8 ***$ *&&** sexx aaa bbb
首先千万不要用string,会全部超时!
后面只需用%s读入一段单词,然后过滤掉除字母以外的东西,用临时变量存起来,跟字典里面的依次比较
稍微注意一点不超时就可以了
/*
C++ Code
http://blog.csdn.net/jiangzh7
*/
#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
#define MAXN 10010
#define MAXS 100010
int n;
char s[MAXS];
char word[MAXN][300];
int main()
{
freopen("words.in","r",stdin);
freopen("words.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%s",word[i]);
char temp[MAXS];
while(scanf("%s",&s)!=EOF)
{
int len=0;
memset(temp,0,sizeof(temp));
for(int i=0;i<strlen(s);i++)
if(isalpha(s[i])) temp[len++]=s[i];
bool flag=false;
for(int k=1;k<=n;k++)
if(!strcmp(word[k],temp))
{flag=true;break;}
if(flag)//出现要屏蔽的单词
{
for(int i=0;i<strlen(s);i++)
if(isalpha(s[i])) printf("*");
else printf("%c",s[i]);
}
else printf("%s",s);//未出现 直接输出
printf(" ");
}
return 0;
}