[2-SAT]编码
- 题意:给n个01字符串,每个最多包含1个'?',能否构造出满足两两不存在一个是另一个前缀的方案。
- 思路:
2-SAT+trie树优化建图
把每个字符串拆成i,i+n,如果不存在'?',就硬搞出两种情况(然后id错的->id对的)
我一开始想的是:trie树上每个节点连出对立点。Trie树边连双向,每个点连对应trie树上的点。
不过会发现每个点会多到一个它本身的对立点。
呜呜~我想半天都不会……解决这个问题,后来看了题解
瓶颈在于这个对立点跟其余跟它字符串相等的点(所谓当前挂在同一个trie节点上的点),如果不暴力连的话总是互相牵连
所以就强制同一个trie节点上的点的父子关系,每个点拆出来,具体可见code的Add_trie。
然后对立点就独立了。
又有问题了?怎么把它独立出来,连它父亲,它儿子好像怎么会多余两个点。
然后就想到把trie'树拆成两棵,出树和入树。
总结一下:
本来每个点连向对应trie'的点,每个trie'的点连向该对立点。满足我们的目的(无论子树内还是祖先上下都能由原节点传到对立点)
为了排除u->u':出树中原节点连对应点的父亲,入树中对立点由原树中该点的父亲连入
- code
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
const int N=3e6+5;
const int M=2;
int fa[N],_[N],to[N<<1],head[N],nxt[N<<1],go[N][M],ecnt,ncnt,num;
int n,nn,mark[N],pos[N];
char s[N];
vector<int>V[N];
void add_edge(int u,int v) {nxt[++ecnt]=head[u];to[ecnt]=v;head[u]=ecnt;}
void Insert(int id) {
int u=0,len=strlen(s);
for(int i=0;i<len;i++) {
int d=s[i]-'0';
if(!go[u][d])go[u][d]=++ncnt;
u=go[u][d];
}
V[u].push_back(id);
}
void Add_trie(int u,int fr) {
for(int d=0;d<=1;d++) {
int x=go[u][d],sz,tmp=fr;
if(!x)continue;
for(int j=0;j<V[x].size();j++) {
int y=V[x][j];pos[y]=++num;
fa[pos[y]]=fr;
add_edge(pos[y],fr);add_edge(fr+nn,pos[y]+nn);fr=pos[y];
}
Add_trie(x,fr);fr=tmp;
}
}
void init2() {
for(int i=1;i<=(n<<1);i++) {
int f=fa[pos[i]];
add_edge(i,f),add_edge(pos[i],_[i]),add_edge(i,pos[i]+nn),add_edge(f+nn,_[i]);
}
}
int dfn[N],low[N],Time,st[N],tp,Bl[N],SCC;
bool In_s[N];
void Tarjan(int u) {
In_s[st[++tp]=u]=1;dfn[u]=low[u]=++Time;
for(int i=head[u];i;i=nxt[i]) {
int v=to[i];
if(!dfn[v]) Tarjan(v),low[u]=min(low[u],low[v]);
else if(In_s[v])low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]) {
++SCC;int v;
do {
v=st[tp--];In_s[v]=0;Bl[v]=SCC;
}while(u!=v);
}
}
bool _rd() {for(int i=1;i<=n;i++)if(Bl[i]==Bl[_[i]])return 0;return 1;}
int main() {
// freopen("data.in","r",stdin);
scanf("%d",&n);num=ncnt=nn=n<<1;num++;nn++;
for(int i=1;i<=n;i++) {
_[i]=i+n,_[i+n]=i;
scanf("%s",s);int len=strlen(s);
bool flag=0;
for(int j=0;j<len;j++)if(s[j]=='?') {
s[j]='0',Insert(i);s[j]='1',Insert(_[i]);flag=1;break;
}
if(flag)continue;
Insert(i);s[0]=s[0]=='0'?'1':'0';Insert(_[i]);add_edge(_[i],i);
}
Add_trie(0,num);
init2();
for(int i=1;i<=num+nn;i++)if(!dfn[i])Tarjan(i);
if(_rd()) printf("YES");
else printf("NO");
return 0;
}
[2-SAT]编码的更多相关文章
- 前端学HTTP之实体和编码
前面的话 每天都有各种媒体对象经由HTTP传送,如图像.文本.影片以及软件程序等.HTTP要确保它的报文被正确传送,识别.提取以及适当处理.为了实现这些目标,HTTP使用了完善的标签来描述承载内容的实 ...
- 2.keras实现-->字符级或单词级的one-hot编码 VS 词嵌入
1. one-hot编码 # 字符集的one-hot编码 import string samples = ['zzh is a pig','he loves himself very much','p ...
- (转)x264 编码流程
转自:http://alphamailpost.blog.163.com/blog/static/20111808120128111160728/ http://www.usr.cc/thread-5 ...
- 服务器返回中文乱码的情况(UTF8编码 -> 转化为 SYSTEM_LOCALE 编码)
服务器乱码 转换使用如下方法 入惨{“msg”} -> utf8编码 -> 转化为 SYSTEM_LOCALE 编码 -> 接受转换后的参数 "sEncoding" ...
- DAO层单元测试编码和问题排查
DAO层单元测试编码和问题排查 SecKillDaoTest .java(注意接口参数使用注解@Parm(“parameter”)) package org.secKill.dao; import o ...
- Day 19:Properties配置文件类、打印流(printStream) 、 编码与解码
Properties(配置文件类): 主要用于生产配置文件与读取配置文件的信息. Properties要注意的细节: 1. 如果配置文件的信息一旦使用了中文,那么在使用store方法生成配置文件的时 ...
- Python编码记录
字节流和字符串 当使用Python定义一个字符串时,实际会存储一个字节串: "abc"--[97][98][99] python2.x默认会把所有的字符串当做ASCII码来对待,但 ...
- URL安全的Base64编码
Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...
- myeclipse学习总结一(在MyEclipse中设置生成jsp页面时默认编码为utf-8编码)
1.每次我们在MyEclispe中创建Jsp页面,生成的Jsp页面的默认编码是"ISO-8859-1".在这种情况下,当我们在页面中编写的内容存在中文的时候,就无法进行保存.如下图 ...
- Base64编码
Base64编码 写在前面 今天在做一个Android app时遇到了一个问题:Android端采用ASE对称加密的数据在JavaWeb(jre1.8.0_7)后台解密时,居然解密失败了!经过测试后发 ...
随机推荐
- 实现拖拽复制和可排序的react.js组件
在实现复制前,对之前的拖拽排序组件属性进行了修改. 摒弃了value中的content属性,拖拽组件暴露的render函数,利用这个属性进行组件内部子组件的渲染,这点主要是参考了蚂蚁金服的Ant de ...
- D2Admin 8月更新: 高级数据持久化|标签页右键|模块化等
剧透:这次,D2Admin 带来了其它同类模板都没有的"花式"数据持久化功能,以及极少同类产品才有的标签页右键控制... 概述 D2Admin 7月份更新到了 1.1.5 版本 相 ...
- 使用 NIO 搭建一个聊天室
使用 NIO 搭建一个聊天室 前面刚讲了使用 Socket 搭建了一个 Http Server,在最后我们使用了 NIO 对 Server 进行了优化,然后有小伙伴问到怎么使用 Socket 搭建聊天 ...
- int bool str
一. python的基本数据类型 1. int 整数 2. bool 布尔. 判断. if while 3. str 字符串 ,一般存放小量的数据 4. list 列表. 可以存放大量的数据 ...
- mybatis-day1入门案例
首先应先创建maven工程 (jar包要导入,五个核心jar包) 如果测试运行时出现了不支持版本5,则要修改以下内容 类的路径如下 1.配置pom.xml依赖 <?xml version=&qu ...
- SpringCloud Alibaba入门之Nacos(SCA)
SpringCloud Alibaba Spring Cloud Alibaba 致力于提供微服务开发 的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Clo ...
- 安卓记账本开发学习day3
今天发现了新的错误 首先是AS警告杀毒系统对编译运行有影响,我目前只开了火绒,所以只需要在火绒里将SDK文件夹设置为信任即可 第二个错是在编译测试运行的时候,虚拟机能够正常打开,也launch suc ...
- ionic系列教程 2 ---- 安装
开发平台注意点首先,我们需要注意构建Ionic App需要的最低配置:Ionic只支持iOS6 +和Android 4.0 + ,(虽然2.3可以工作,但会有点卡).但是,Android设备众多,可能 ...
- Mozi.HttpEmbedded嵌入式Web服务器
Mozi.HttpEmbedded 嵌入式Web服务器 项目介绍 Mozi.HttpEmbedded是一个基于.Net构建的嵌入式Web服务器,为.Net App提供web服务功能. 嵌入式的目标不是 ...
- 事务的隔离级别与MVCC
提到数据库,你多半会联想到事务,进而还可能想起曾经背得滚瓜乱熟的ACID,不知道你有没有想过这个问题,事务有原子性.隔离性.一致性和持久性四大特性,为什么偏偏给隔离性设置了级别? 一切还得从事务说起. ...