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 ...
随机推荐
- jdbc批量插入数据
//插入很多书(批量插入用法) public void insertBooks(List<Book> book) { final List<Book> tempBook=b ...
- 【JAVA基础】03 Java语言基础
前言:流程控制语句 什么是流程控制语句 流程控制语句:可以控制程序的执行流程. 流程控制语句的分类 顺序结构 选择结构 循环结构 执行流程: 从上往下,依次执行. 案例演示 输出几句话看效果即可 cl ...
- 在okhttp的callback回调中加Toast出现Cant create handler inside hread that has not called Looper.prepare()...
2019独角兽企业重金招聘Python工程师标准>>> 分析:callback中回调的response方法中还是在子线程中运行的,所以要调取Toast必须回到主线程中更新ui 解决方 ...
- Nodejs与Mysql交互实现(异步写法,同步写法)
https://blog.csdn.net/think_A_lot/article/details/93498737
- codeforce 227D Naughty Stone Piles (贪心+递归+递推)
Description There are n piles of stones of sizes a1, a2, -, an lying on the table in front of you. D ...
- 图论--Floyd总结
Key word: ①最短路 ②传递闭包:大小关系 数值关系 先后关系 联通关系 ③floyd变形 ④实现方式:插点发法 ⑤思想:动态规划 1.最短路: 最短路 ...
- Spring 注解注入—@Qualifier 注释
当创建多个具有相同类型的 bean 时,并且想要用一个属性只为它们其中的一个进行装配,在这种情况下,你可以使用 @Qualifier 注释和 @Autowired 注释通过指定哪一个真正的 bean ...
- vue 搭建框架到安装插件依赖,Element、axios、qs等
一.使用vue 单页面开发,首先要安装好本地环境 步骤如下: 1 下载nodejs 安装 (此时npm 和 node环境都已经装好)2 安装淘宝镜像 npm install -g cnpm --reg ...
- Jetson AGX Xavier安装TensorFlow
参考https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform/#prereqs 1. 安装系统包 sudo ...
- D - Pearls HDU - 1300 斜率dp+二分
D - Pearls HDU - 1300 这个题目也是一个比较裸的斜率dp,依照之前可以推一下这个公式,这个很好推 这个注意题目已经按照价格升序排列序,所以还是前缀和还是单调的. sum[i] 表示 ...