zoukankan      html  css  js  c++  java
  • P3167 [CQOI2014]通配符匹配

    吐槽

    本来是去写AC自动机的,然后发现数据范围每个串100000,有100个串(???),连塞进trie树里都塞不进去,玩个鬼的AC自动机啊,tag不要乱打啊
    最后拿字符串hash+爆搜一发搜过去了。。。

    思路

    挺恶心的搜索吧
    考虑分段,按?号和*号分段,对于每段内的hash判断是否一致,*号和?号按题意处理即可
    然后边界不要写挂就好了

    代码

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int base=131;
    int xing[100100],wen[100100],n,lens,cntx,cntw,lent;
    unsigned long long hashs1[100100],hashs2[100100],pow[100100];
    char s[100100],t[100100];
    void init(void){
        pow[0]=1;
        for(int i=1;i<=100001;i++)
            pow[i]=pow[i-1]*base;
    }
    unsigned long long hash1(int l,int r){
        return hashs1[r]-hashs1[l-1]*pow[r-l+1]; 
    }
    unsigned long long hash2(int l,int r){
        return hashs2[r]-hashs2[l-1]*pow[r-l+1];
    }
    bool dfs(int poss,int post){
        // printf("%d %d
    ",poss,post);
        if(poss==lens+1&&post==lent+1){
            return true;
        }
        else if(poss==lens+1||post==lent+1)
            return false;
        if(s[poss]=='*'){
            for(int i=post;i<=lent+1;i++)
                if(dfs(poss+1,i))
                    return true;
            return false;
        }
        else if(s[poss]=='?'){
            return dfs(poss+1,post+1);
        }
        else{
            int tx=lower_bound(xing+1,xing+cntx+1,poss)-(xing),tw=lower_bound(wen+1,wen+cntw+1,poss)-(wen);
            // printf("tx=%d tw=%d
    ",tx,tw);
            // printf("compare 1(%d,%d) 2(%d,%d) :
    ",poss,min(xing[tx],wen[tw])-1,post,post+min(xing[tx],wen[tw])-poss-1);
            if(hash1(poss,min(xing[tx],wen[tw])-1)==hash2(post,post+(min(xing[tx],wen[tw])-poss-1))){
                // printf("true
    ");
                return dfs(min(xing[tx],wen[tw]),post+(min(xing[tx],wen[tw])-poss));
            }
            else
            {
                // printf("false
    ");
                return false;
            }
        }
    }
    int main(){
        init();
        scanf("%s",s+1);
        lens=strlen(s+1);
        for(int i=1;i<=lens;i++){
            if(s[i]!='*'||s[i]!='?')
                hashs1[i]=hashs1[i-1]*base+s[i];
            if(s[i]=='*')
                xing[++cntx]=i;
            if(s[i]=='?')
                wen[++cntw]=i;
        }
        xing[++cntx]=lens+1;
        wen[++cntw]=lens+1;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%s",t+1);
            lent=strlen(t+1);
            memset(hashs2,0,sizeof(hashs2));
            for(int j=1;j<=lent;j++){
                hashs2[j]=hashs2[j-1]*base+t[j];
            }
            printf("%s
    ",dfs(1,1)?"YES":"NO");
        }
        return 0;
    }
    
  • 相关阅读:
    CF1454F Array Partition
    leetcode1883 准时抵达会议现场的最小跳过休息次数
    leetcode1871 跳跃游戏 VII
    leetcode1872 石子游戏VIII
    CF1355C Count Triangles
    CF1245D Shichikuji and Power Grid
    CF1368C Even Picture
    CF1368D AND, OR and square sum
    CF1395C Boboniu and Bit Operations
    SpringBoot和开发热部署
  • 原文地址:https://www.cnblogs.com/dreagonm/p/10456403.html
Copyright © 2011-2022 走看看