zoukankan      html  css  js  c++  java
  • 【BZOJ】1590: [Usaco2008 Dec]Secret Message 秘密信息

    Description

        贝茜正在领导奶牛们逃跑.为了联络,奶牛们互相发送秘密信息.
        信息是二进制的,共有M(1≤M≤50000)条.反间谍能力很强的约翰已经部分拦截了这些信息,知道了第i条二进制信息的前bi(l《bi≤10000)位.他同时知道,奶牛使用N(1≤N≤50000)条密码.但是,他仅仅了解第J条密码的前cj(1≤cj≤10000)位.
        对于每条密码J,他想知道有多少截得的信息能够和它匹配.也就是说,有多少信息和这条密码有着相同的前缀.当然,这个前缀长度必须等于密码和那条信息长度的较小者.
        在输入文件中,位的总数(即∑Bi+∑Ci)不会超过500000.

    Input

        第1行输入N和M,之后N行描述秘密信息,之后M行描述密码.每行先输入一个整数表示信息或密码的长度,之后输入这个信息或密码.所有数字之间都用空格隔开.

    Output

     
        共M行,输出每条密码的匹配信息数.

    Sample Input

    4 5
    3 0 1 0
    1 1
    3 1 0 0
    3 1 1 0
    1 0
    1 1
    2 0 1
    5 0 1 0 0 1
    2 1 1

    INPUT DETAILS:

    Four messages; five codewords.
    The intercepted messages start with 010, 1, 100, and 110.
    The possible codewords start with 0, 1, 01, 01001, and 11.


    Sample Output

    1
    3
    1
    1
    2
      题解:
        字典树,找前缀,记录位置
     
    #include <cstdio> 
    #include <cstring> 
    const int MAXN=500001;
    struct node 
    { 
        int s; 
        int link[2]; 
    }t[MAXN]; 
    int ans; 
    int nt; 
    int n,m; 
    int sum[MAXN];
    void add(int len) 
    { 
        int x;
        int ansm=0; 
        int p=0; 
        for(int i=1;i<=len;i++)
        {
            scanf("%d",&x);
            int zz=x; 
            if(t[p].link[zz]==0) 
            t[p].link[zz]=++nt;      
            p=t[p].link[zz]; 
            sum[p]++;
        }  
        t[p].s++; 
    } 
    int Query(int len)
    {
        int x;
        int ans=0; 
        int p=0; 
        for(int i=1;i<=len;i++)
        {
            scanf("%d",&x);
            int zz=x; 
            if(!t[p].link[zz]) 
            {
                for(i=i+1;i<=len;i++) 
                scanf("%d",&x);
                return ans;
            }  
            p=t[p].link[x];
            ans+=t[p].s;
        }  
        return ans-t[p].s+sum[p];
    }
    int main() 
    { 
        char z[100]=""; 
        scanf("%d%d",&n,&m); 
        int x;
        for(int i=1;i<=n;i++) 
        { 
            scanf("%d",&x); 
            add(x); 
        } 
        for(int i=1;i<=m;i++)
        {
            scanf("%d",&x),printf("%d
    ",Query(x));
        }
    }
  • 相关阅读:
    mysql常用基本命令
    mysql8.0.13下载与安装图文教程
    k8s ingress 增加跨域配置
    Jenkins 备份恢复插件 thinBackup 使用
    k8s HA master 节点宕机修复
    nginx 跨域问题解决
    mongodb 3.4.24 主从复制
    k8s 线上安装 jenkins并结合 jenkinsfile 实现 helm 自动化部署
    k8s helm 运用与自建helm仓库chartmuseum
    centos6 源码安装 unzip
  • 原文地址:https://www.cnblogs.com/BeyondW/p/5832079.html
Copyright © 2011-2022 走看看