时间限制:1S / 空间限制:256MB
【在线测试提交传送门】
【问题描述】
Watto, the owner of a spare parts store, has recently got an order for the mechanism that can process strings in a certain way. Initially the memory of the mechanism is filled with n strings. Then the mechanism should be able to process queries of the following type: "Given string s, determine if the memory of the mechanism contains string t that consists of the same number of characters as s and differs froms in exactly one position". Watto has already compiled the mechanism, all that's left is to write a program for it and check it on the data consisting of n initial lines and m queries. He decided to entrust this job to you. 给定n个字符串和m个询问。对于每一个询问,给出一个字符串s,询问在n个字符串中是否存在字符串t,满足s和t的长度相同,且有且只有1个字符不同。
【输入格式】
The first line contains two non-negative numbers n and m (0 ≤ n ≤ 3·105, 0 ≤ m ≤ 3·105) — the number of the initial strings and the number of queries, respectively. Next follow n non-empty strings that are uploaded to the memory of the mechanism. Next follow m non-empty strings that are the queries to the mechanism. The total length of lines in the input doesn't exceed 6·105. Each line consists only of letters 'a', 'b', 'c'. 第一行,保护两个整数n和m(0 ≤ n ≤ 3*10^5, 0 ≤ m ≤ 3*10^5) 。 接下来n行,每行一个非空字符串,表示n个给定的字符串; 接下来m行,每行一个非空字符串,表示m个询问。 输入的所有字符串的总长度不超过6*10^5,且只保护小写字母'a', 'b', 'c'。
【输出格式】
For each query print on a single line "YES" (without the quotes), if the memory of the mechanism contains the required string, otherwise print "NO" (without the quotes). 输出共m行,对每个询问市场一个字符串"YES"或者 "NO" 。
【输入样例1】
2 3 aaaaa acacaca aabaa ccacacc caaac
【输出样例1】
YES NO NO
【题目来源】
Codeforces 514C
【解题思路】
Trie树建好之后深搜,同时记录当前是否已经在以前有一个字符不同。
【参考代码】
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
int T,t,n,m;
char s[1000010];
struct Trie
{
int index;
Trie *next[3];
Trie()
{
index=-1;
memset(next,0,sizeof(next));
}
};
Trie *root=new Trie;
void Trie_Insert(Trie *tr,int len)
{
if(s[len]!='\0')
{
if(tr->next[s[len]-'a']==0)
tr->next[s[len]-'a']=new Trie;
Trie_Insert(tr->next[s[len]-'a'],len+1);
}
else
tr->index=1;
}
bool dfs(Trie *tr,int len,int f)
{
if(s[len]=='\0' )
{
if(f==0 && tr->index==1)
return true;
else
return false;
}
if(tr->next[s[len]-'a']!=0)
{
if(dfs(tr->next[s[len]-'a'],len+1,f))
return true;
}
if(f==1)
{
int i;
for(i=0;i<=2;i++)
if(i!=s[len]-'a' && tr->next[i]!=0)
if(dfs(tr->next[i],len+1,0))
return true;
}
return false;
}
int main()
{
int i,j,k;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%s",s+1);
Trie_Insert(root,1);
}
for(i=1;i<=m;i++)
{
scanf("%s",s+1);
if(dfs(root,1,1))
printf("YES\n");
else
printf("NO\n");
}
}