BZOJ1080 暴力+位移运算符的用法
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
1
1010
01
10101
Sample Output
#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 暴力+位移运算符的用法的更多相关文章
- JS逗号运算符的用法详解
逗号运算符的用法详解 注意: 一.由于目前正在功读JavaScript技术,所以这里拿JavaScript为例.你可以自己在PHP中试试. 二.JavaScript语法比较复杂,因此拿JavaScri ...
- PHP 位移运算符(<<左移和>>右移)
位移运算符 << 位左移 左移运算的实质是将对应的数据的二进制值逐位左移若干位,并在空出的位置上填0,最高位溢出并舍弃.例 如 $a=10; $b=$a<<2; 则$b=40, ...
- C#位移运算符
代码如下: /// <summary> /// 位移运算符"<<"左位移运算符,">>"右位移运算符 /// 在进行位移运算 ...
- Java补码表和位移运算符
在java中数据都是以二进制的形式保存的. 但是我们看到的数据怎么是10进制的? 因为java展示之前会自动调用toString()方法 这里以4位2进制为例,4位2进制只能表示16个数,即0-15. ...
- Java学习路线:Java中的位移运算符介绍
学习java本来就是一件日积月累的事情,或许你通过自学能掌握一些皮毛技术,学到java的一些基本大面,但想要做到精通,还是需要自己技术的日积月累和工作经验的不断积累. 今天给大家分享的技术知识是:ja ...
- Java 中位移运算符 >>,>>>,<<
Java 中的三种位移运算符 java中有三种移位运算符 << : 左移运算符,num << 1,相当于num乘以2 >> : ...
- C语言实现用位移运算符进行加减乘…
最近,在百度知道上回答问题,然后看见有的人问如何用位移运算符去进行加减乘除运算,于是巩固今天就在这总结一下. 先讲讲总体思路: 加法运算:将一个整数用二进制表示,其加法运算就是:相异(^)时, ...
- 正经学C#_位移与其位移运算符[c#入门经典]
在c#入门经典一书中,最为糟糕的一节就是位移了,完全没有讲明白,也没有说全,似乎只是轻轻点了一下何为位移,带了两次原码和补码,完全不理会是否明白不明白.这一点这本书很差.因为此书说了,在大多数应用开发 ...
- Lua中..和#运算符的用法
Lua中..和#运算符的用法 样例 试试以下的样例就明确了在Lua编程语言提供的其它运算符: a = "Hello " b = "World" print(&q ...
随机推荐
- 【linux题目】第一关
详细的解答:https://github.com/Zoe233/Linux/blob/master/[题目]5.Linux了解程度测试题解析.ipynb 1. 创建一个目录/data 解答: mkdi ...
- 《SQL初学者指南》——第1章 关系型数据库和SQL
第1章 关系型数据库和SQL SQL初学者指南在本章中,我们将介绍一些背景知识,以便于你能够很快地上手,能在后续的章节中编写SQL语句.本章有两个主题.首先是对本书所涉及到的数据库做一个概述,并且介绍 ...
- 由JS数组去重说起
一.问题描述: var array=[1,45,3,1,4,67,45],请编写一个函数reDup来去掉其中的重复项,即 reDup(array); console.log(array);//[1,4 ...
- 监控之--Nagios如何监控本地主机及本地服务
上一节内容介绍了Nagios监控服务在linux环境下的安装过程,本节内容将详细介绍如何使用已经安装的Nagios服务的一些配置文件的使用以及如何监控本地相关服务,如要完成对一台主机的监控Nagios ...
- DeepWalk论文精读:(3)实验
模块三 1 实验设计 1.1 数据集 BLOGCATALOG[39]:博客作者网络.标签为作者感兴趣的主题. FLICKR[39]:照片分享网站的用户网络.标签为用户的兴趣群组,如"黑白照片 ...
- C语言编程入门题目--No.11
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3, ...
- POJ2421 Constructing Roads 最小生成树
修路 时限: 2000MS 内存限制: 65536K 提交总数: 31810 接受: 14215 描述 有N个村庄,编号从1到N,您应该修建一些道路,使每两个村庄可以相互连接.我们说两个村庄A ...
- python基础入门教程(一条龙服务)
一.语言基础 01-1 计算机系统 解释器下载 变量 小整数池 01-2 垃圾回收机制 02 数据类型 运算符(解压赋值等) 03 流程控制 if while for 04 整形 字符串 列表 0 ...
- andorid jar/库源码解析
前言 本篇作为开篇,会大体上说明,需要解读源码的,类库,或者jar. 序 原本,类库和jar的系列准备写到逆向系列课程的,但是那个东西,在写了两篇,就没有后续了,现在也不知道从哪里开始了, 只能等后期 ...
- D. Mysterious Present DAG dp
https://codeforces.com/problemset/problem/4/D 这个题目比较简单,就是一个DAG模型,这个可以看看紫书学习一下, 我这次是用dp来写的,用记忆化搜索也许更好 ...