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. java中Future的使用

    文章目录 创建Future 从Future获取结果 取消Future 多线程环境中运行 java中Future的使用 Future是java 1.5引入的一个interface,可以方便的用于异步结果 ...

  2. KVM虚拟化平台环境部署

    一:安装依赖包 二:配置网卡 三:配置环境 实验环境: KVM01   192.168.200.10 关闭防火墙及相关的安全机制 [root@KVM01 ~]# systemctl stop fire ...

  3. "net.sf.hibernate.PropertyValueException"

    2019独角兽企业重金招聘Python工程师标准>>> 如果你遇到了下面的错误信息,例如: ERROR [Importing data task] [confluence.impor ...

  4. SQL SERVER 性能优化二: 数据库初始值大小及增长方式设置

    数据库增长方式主要有两种,按百分比自动增长和按固定大小自动增长,设置初始大小和增长方式需谨慎. 初始大小就是建库的大小,设小了,容易造成磁盘碎片,频繁增长也会影响IO响应.设大了,也不行,设大了,每次 ...

  5. 02-线性结构4 Pop Sequence

    02-线性结构4 Pop Sequence   (25分) 时间限制:400ms 内存限制:64MB 代码长度限制:16kB 判题程序:系统默认 作者:陈越 单位:浙江大学 https://pta.p ...

  6. IIS6服务器的请求流程(图文&源码)

    1.IIS 7开发与管理完全参考手册  http://book.51cto.com/art/200908/146040.htm 2.Web服务IIS 6   https://technet.micro ...

  7. 2019年 ICPC亚洲区预赛(上海赛区)总结

    首先,我要说,我输了,输给了自己的无知,输给了自己的心态与实力. 上海区域赛,打铁而归,最终还是没有比过自己SLG的朋友.要说什么呢?实力的差距,还是说给自己的失败找借口?不能进入金牌区,为什么铜牌区 ...

  8. django源码分析——本地runserver分析

    本文环境python3.5.2,django1.10.x系列 1.根据上一篇文章分析了,django-admin startproject与startapp的分析流程后,根据django的官方实例此时 ...

  9. 多线程高并发编程(7) -- Future源码分析

    一.概念 A Future计算的结果. 提供方法来检查计算是否完成,等待其完成,并检索计算结果. 结果只能在计算完成后使用方法get进行检索,如有必要,阻塞,直到准备就绪. 取消由cancel方法执行 ...

  10. 无回显命令执行TIPS

    DNSlog 出属于, POST DATA   HEX  等一些 命令延迟注入 找WEB PATH 将id,pwd,hostname的结果写在js/test1.txt中,命令find . -type  ...