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;
    }
    
  • 相关阅读:
    PKU_3624(0-1背包)
    背包问题之01背包
    背包问题
    HDU--2602(0-1背包)
    基于baseline、svd和stochastic gradient descent的个性化推荐系统
    基于baseline和stochastic gradient descent的个性化推荐系统
    基于neighborhood models(item-based) 的个性化推荐系统
    基于物品的协同过滤推荐算法——读“Item-Based Collaborative Filtering Recommendation Algorithms”
    基于用户的最近邻协同过滤算法(MovieLens数据集)
    7--操作符重载(1)
  • 原文地址:https://www.cnblogs.com/dreagonm/p/10456403.html
Copyright © 2011-2022 走看看