2017百度校园招聘编程题

来源:互联网 发布:软件开发毕业设计题目 编辑:程序博客网 时间:2024/06/05 05:43

题目大概为输入n个敏感词汇和一个文本串,在文本串中出现敏感词汇的地方用'*'替代掉,输出替换后的文本串。

思路:直接kmp匹配出现敏感词的地方,用一个中间数组标记。唯一的陷阱就是不区分大小写,所以用kmp判断两个字符相等的注意下:

// 替换敏感词汇#include <iostream>#include <cstring>#include <cstdio>#include <cmath>using namespace std;char T[10006],P[106][106],f[106];int vis[10006];bool cmp(char& a,char& b){ // no case char    if(a==b || abs(int(a-b))==32)        return true;    else        return false;}void getFaid(char* p){int m=strlen(p);f[0]=f[1]=0;for(int i=1;i<m;i++){int j=f[i];while(j && !cmp(p[j],p[i])) j=f[j];f[i+1]=cmp(p[j],p[i])?j+1:0;}}void kmp(char *t,char* p){int n=strlen(t);int m=strlen(p);getFaid(p);int j=0;for(int i=0;i<n;i++){while(j && !cmp(t[i],p[j])) j=f[j];if(cmp(p[j],t[i])) j++;if(j==m){/*cout<<i-m+1<<" "<<i<<endl;*/for(int k=i-m+1;k<=i;k++)                vis[k]=1;j=0;}}}int main(){int n;cin>>n;for(int i=0;i<n;i++){        cin>>P[i];}getchar();cin.getline(T,10000);memset(vis,0,sizeof(vis));for(int i=0;i<n;i++){        kmp(T,P[i]);}    for(int i=0;T[i];i++){        if(vis[i])            cout<<'*';        else            cout<<T[i];    }    cout<<endl;return 0;}


0 0
原创粉丝点击