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 ...
随机推荐
- 数据挖掘入门系列教程(十二)之使用keras构建CNN网络识别CIFAR10
简介 在上一篇博客:数据挖掘入门系列教程(十一点五)之CNN网络介绍中,介绍了CNN的工作原理和工作流程,在这一篇博客,将具体的使用代码来说明如何使用keras构建一个CNN网络来对CIFAR-10数 ...
- values/colors.xml
<color name="abcd">#FFC4C4C4</color> <color name="white">#FFFF ...
- Struts2深入之动态调用Action
使用过Struts2的小伙伴们应该知道当我们的action的方法过多是如果需要通过Struts2框架进行运行,我们就必须在Struts2的配置文件Struts2.xml文件中配置多个action属性标 ...
- java中for循环和while循环,哪个更快?--一道面试题
for的 while的
- Mysql 开窗函数实战
Mysql 开窗函数实战 Mysql 开窗函数在Mysql8.0+ 中可以得以使用,实在且好用. row number() over rank() over dense rank() ntile() ...
- Codeforces Round 623(Div. 2,based on VK Cup 2019-2020 - Elimination Round,Engine)D. Recommendations
VK news recommendation system daily selects interesting publications of one of n disjoint categories ...
- 2019 ICPC 南京网络赛 F Greedy Sequence
You're given a permutation aa of length nn (1 \le n \le 10^51≤n≤105). For each i \in [1,n]i∈[1,n], c ...
- 基于UDP的客户端和服务器端的代码设计
实验平台 linux 实验内容 编写UDP服务器和客户端程序,客户端发送消息,服务器接收消息,并打印客户端的IP地址和端口号. 实验原理 UDP是无需连接的通信,其主要实现过程如下: 同样,我们可以按 ...
- CF1336C Kaavi and Magic Spell
CF1336C Kaavi and Magic Spell 区间dp 题意 给一个长度为 \(n\) 的字符串 \(S\) 和一个长度为 \(m\) 的字符串\(T\) ,\(1\le m\le n\ ...
- redis系列之2----详细讲解redis数据结构(内存模型)以及常用命令
Redis数据类型 与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String.List.Hash.Set和Sor ...