Codeforces Round #291 (Div. 2) 514C Watto and Mechanism

时间限制: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");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值