【字符串处理】文明的复兴 words.pas/c/cpp/in/out
文明的复兴
(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://oijzh.cnblogs.com */ #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; }
..... 转载请注明出处 ..... http://oijzh.cnblogs.com ..... by jiangzh