记录编号 472146 评测结果 AAAAAAAAAAA
题目名称 文章过滤器 最终得分 100
用户昵称 GravatarJustWB 是否通过 通过
代码语言 C++ 运行时间 0.016 s
提交时间 2017-11-07 12:49:14 内存使用 0.98 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>
const int maxn=1e5+5;
using namespace std;
void pro(int now);
int n,next[maxn];
char w[51][21];
char c[maxn],C[maxn];
bool J[maxn];
int main()
{
	freopen("fliter.in","r",stdin);
	freopen("fliter.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%s",w[i]);
		for(int j=strlen(w[i])-1;j>=0;j--)w[i][j]=tolower(w[i][j]);
	}
	getchar();
	char temp=getchar();
	for(int i=0;temp!='\n';i++,temp=getchar())c[i]=tolower(temp),C[i]=temp;
	int str=strlen(c);
	for(int i=1;i<=n;i++)
	{
		pro(i);
		int j=0,m=strlen(w[i]);
		for(int k=0;k<str;k++)
		{
			while(j&&c[k]!=w[i][j])j=next[j];
			if(c[k]==w[i][j])j++;
			if(j==m)
				for(int l=k-m+1;l<=k;l++)J[l]=true;
		}
	}
	for(int i=0;i<str;i++)
		if(J[i])putchar('*');
		else putchar(C[i]);
	return 0;
}
void pro(int now)
{
	int len=strlen(w[now]);
	memset(next,0,sizeof(next));
	next[0]=next[1]=0;
	for(int i=1;i<len;i++)
	{
		int j=next[i];
		while(j&&w[now][i]!=w[now][j])j=next[j];
		next[i+1]= w[now][i]==w[now][j] ? j+1:0;
	}
}