【字符串处理】文明的复兴 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;
}

  

 

posted @ 2012-10-24 16:56  jiangzh  阅读(363)  评论(0编辑  收藏  举报