码迷,mamicode.com
首页 > 其他好文 > 详细

Codefoces514C - Watto and Mechanism(Tire)

时间:2020-02-25 23:34:30      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:flag   nbsp   cout   return   out   题意   amp   using   name   

题意:

给n个模式串,m个匹配串,问是否有只与匹配串相差一个字符的模式串

思路:

直接上Tire,正常插入模式串

匹配时往该节点的儿子节点进行正常匹配,若能匹配成功,就输出YES

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
 using namespace std;
 const int maxn=1e6+10;
 int n,m;
 struct Tire{
     int ch[maxn][3],val[maxn],cnt;
     void init()
     {
         cnt=1;
         memset(ch,0,sizeof(ch));
         val[0]=0;
     }
     void insert(string s){
        int u=0,n=s.length();
        for(int i=0;i<n;i++){
            int c=s[i]-a;
            if(!ch[u][c]) ch[u][c]=cnt++;
            u=ch[u][c];
        }
        val[u]=cnt;
    }
    bool query(string s){
        int u=0,n=s.length(),flag,k;
        for(int i=0;i<n;i++){
            int c=s[i]-a;
            for(int j=0;j<=2;j++){
                if(c==j||ch[u][j]==0) continue;
                int x=ch[u][j];
                flag=1;
                for(int k=i+1;k<n;k++){
                    int y=s[k]-a;
                    if(!ch[x][y]){
                        flag=0;
                        break;
                    }
                    x=ch[x][y];
                }
                if(flag&&val[x]) return true;
            }
            if(!ch[u][c]) return false;
            u=ch[u][c];
        }
        return false;
    }
 }T;
 int main()
 {
     string temp;
    scanf("%d%d",&n,&m);
    T.init();
     for(int i=1;i<=n;i++){
         cin>>temp;
         T.insert(temp);
     }
    for(int i=1;i<=m;i++){
        cin>>temp;
        if(T.query(temp)) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
 }

 

Codefoces514C - Watto and Mechanism(Tire)

标签:flag   nbsp   cout   return   out   题意   amp   using   name   

原文地址:https://www.cnblogs.com/overrate-wsj/p/12364387.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!