1080: [SCOI2008]劣质编码

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 337  Solved: 148
[Submit][Status][Discuss]

Description

  一个编码方案把每个字符对应到一个01串。例如{1,1010,01,10101}就是一个编码方案,它把四个字符(假设
它们为a,b,c,d)分别对应到串1、1010,01,10101。字符串的编码为各字符编码的连接。例如,在刚才的编码方
案中,字符串cac的编码为01101,dcb的编码为10101011010。 进一步分析发现,刚才的编码是相当劣质的,因为
字符串ba, acc和d的编码都是10101。对于一个编码方案,你的任务是找出三个不同的字符串,使得它们的编码全
相同。换句话说,找一个01编码串,使得它至少有三种解码方式。如果有多组解,这个编码串应当尽量短。

Input

  第一行包含一个整数n,即符号的个数。以下n行每行为一个长度不超过50的01串(可能为空串),即各符号的
编码。

Output

  仅一行,包含一个整数,即最短编码的长度。如果无解,输出-1。

Sample Input

4
1
1010
01
10101

Sample Output

5
 
 
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<string>
#include<map>
using namespace std;
typedef vector<int> ve;
map<ve,int>hash;
queue<ve>Q;
string s[];
int n;
void work(){
    ve u,v,t;
    for(int i=;i<=n;++i)
    if(s[i]=="") {puts("");exit();}
    else u.push_back(i<<);
    hash[u]=;
    Q.push(u);
    while(!Q.empty()){
        u=Q.front();
        Q.pop();
        int x=hash[u],cnt;
        for(int ch='';ch<='';++ch){
            cnt=;
            v.clear();
            for(int i=;i<(int)u.size();++i){
                int which=u[i]>>,where=u[i]&;
                if(s[which][where]^ch) continue;
                if(++where==s[which].size()) {
                    ++cnt;
                    for(int j=;j<=n;++j) v.push_back(j<<);
                }
                else v.push_back(which<<|where);
            }
            if(cnt>=) {printf("%d\n",x+);exit();}
            sort(v.begin(),v.end());
            t.clear();
            for(int i=;i<v.size();++i)
                if(i<||v[i]^v[i-]) t.push_back(v[i]);     //必须是i<m(m>=2)的形式,因为题干要求3个即可退出
            int &th=hash[t];
            if(t.size()&&!th) th=x+,Q.push(t);
        }
    }
    puts("-1");
}
int main(){
   scanf("%d",&n);
   for(int i=;i<=n;++i) cin>>s[i];
   work();
   return ;
}
 
 
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<string>
#include<map>
using namespace std;
typedef vector<int> ve;
map<ve,int>hash;
queue<ve>Q;
string s[];
int n;
void work(){
    ve u,v;
    for(int i=;i<=n;++i)
    if(s[i]=="") {puts("");exit();}
    else u.push_back(i<<);
    hash[u]=;
    Q.push(u);
    while(!Q.empty()){
        u=Q.front();
        Q.pop();
        int x=hash[u],cnt;
        for(int ch='';ch<='';++ch){
            cnt=;
            v.clear();
            for(int i=;i<(int)u.size();++i){
                int which=u[i]>>,where=u[i]&;
                if(s[which][where]^ch) continue;
                if(++where==s[which].size()) {
                    ++cnt;
                    for(int j=;j<=n;++j) v.push_back(j<<);
                }
                else v.push_back(which<<|where);
            }
            if(cnt>=) {printf("%d\n",x+);exit();}
            sort(v.begin(),v.end());   //也可以直接将v压入队列,但是要先排序
            int &th=hash[v];
            if(v.size()&&!th) th=x+,Q.push(v);
        }
    }
    puts("-1");
}
int main(){
   scanf("%d",&n);
   for(int i=;i<=n;++i) cin>>s[i];
   work();
   return ;
}
 
 

BZOJ1080 暴力+位移运算符的用法的更多相关文章

  1. JS逗号运算符的用法详解

    逗号运算符的用法详解 注意: 一.由于目前正在功读JavaScript技术,所以这里拿JavaScript为例.你可以自己在PHP中试试. 二.JavaScript语法比较复杂,因此拿JavaScri ...

  2. PHP 位移运算符(<<左移和>>右移)

    位移运算符 << 位左移 左移运算的实质是将对应的数据的二进制值逐位左移若干位,并在空出的位置上填0,最高位溢出并舍弃.例 如 $a=10; $b=$a<<2; 则$b=40, ...

  3. C#位移运算符

    代码如下: /// <summary> /// 位移运算符"<<"左位移运算符,">>"右位移运算符 /// 在进行位移运算 ...

  4. Java补码表和位移运算符

    在java中数据都是以二进制的形式保存的. 但是我们看到的数据怎么是10进制的? 因为java展示之前会自动调用toString()方法 这里以4位2进制为例,4位2进制只能表示16个数,即0-15. ...

  5. Java学习路线:Java中的位移运算符介绍

    学习java本来就是一件日积月累的事情,或许你通过自学能掌握一些皮毛技术,学到java的一些基本大面,但想要做到精通,还是需要自己技术的日积月累和工作经验的不断积累. 今天给大家分享的技术知识是:ja ...

  6. Java 中位移运算符 >>,>>>,<<

    Java 中的三种位移运算符 java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     ...

  7. C语言实现用位移运算符进行加减乘…

      最近,在百度知道上回答问题,然后看见有的人问如何用位移运算符去进行加减乘除运算,于是巩固今天就在这总结一下.   先讲讲总体思路: 加法运算:将一个整数用二进制表示,其加法运算就是:相异(^)时, ...

  8. 正经学C#_位移与其位移运算符[c#入门经典]

    在c#入门经典一书中,最为糟糕的一节就是位移了,完全没有讲明白,也没有说全,似乎只是轻轻点了一下何为位移,带了两次原码和补码,完全不理会是否明白不明白.这一点这本书很差.因为此书说了,在大多数应用开发 ...

  9. Lua中..和#运算符的用法

    Lua中..和#运算符的用法 样例 试试以下的样例就明确了在Lua编程语言提供的其它运算符: a = "Hello " b = "World" print(&q ...

随机推荐

  1. Scala教程之:静态类型

    文章目录 泛类型 型变 协变 逆变 不变 类型上界 类型下界 内部类 抽象类型 复合类型 自类型 隐式参数 隐式转换 多态方法 类型推断 Scala是静态类型的,它拥有一个强大的类型系统,静态地强制以 ...

  2. 数据挖掘入门系列教程(十二)之使用keras构建CNN网络识别CIFAR10

    简介 在上一篇博客:数据挖掘入门系列教程(十一点五)之CNN网络介绍中,介绍了CNN的工作原理和工作流程,在这一篇博客,将具体的使用代码来说明如何使用keras构建一个CNN网络来对CIFAR-10数 ...

  3. .net 使用TCP模拟UDP广播通信加强广播通信的稳定性

    应用场景:当每一台终端开启程序后发出消息,其他终端必须收到消息然后处理 思路1:使用UDP广播.     缺点:UDP广播信号不稳定,无法确定每一台机器能接收到信号 思路2:将一台主机作为服务器,使用 ...

  4. 什么是.pyc文件

    1. Python是一门解释型语言? Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在. 如果是解释型语言,那么生成的*.pyc文件是什么呢?c应该是compiled ...

  5. Vue集成tinymce富文本编辑器并实现本地化指南(2019.11.21最新)

     tinymce是一款综合口碑特别好.功能异常强大的富文本编辑器,在某些网站,甚至享有"宇宙最强富文本编辑器"的称号.那么,在Vue项目中如何集成呢?这并不困难,只需要参照官方教程 ...

  6. qemu-img 整理

    qemu-img命令语法: qemu-img command [command options] check命令: check [-f fmt < qcow2 | qed | vdi >] ...

  7. spark下dataframe转为rdd格式

    dataframe可以实现很多操作,但是存储到本地的时候,只能存 parquest格式 需要存储源格式,需要转换为rdd类型 将dataframe中的每一行都map成有逗号相连的string,就变为了 ...

  8. NLP入门之语音模型原理

    这一篇文章其实是参考了很多篇文章之后写出的一篇对于语言模型的一篇科普文,目的是希望大家可以对于语言模型有着更好地理解,从而在接下来的NLP学习中可以更顺利的学习. 1:传统的语音识别方法: 这里我们讲 ...

  9. qemu-img压缩磁盘操作

    2019独角兽企业重金招聘Python工程师标准>>> qemu-img convert -c -f qcow2 -O qcow2 /data/data1.disk /opt/dat ...

  10. linux多线程同步的四种方式

    1. 在并发情况下,指令执行的先后顺序由内核决定.同一个线程内部,指令按照先后顺序执行,但不同线程之间的指令很难说清楚是哪一个先执行.如果运行的结果依赖于多线程执行的顺序,那么就会形成竞争条件,每次运 ...