LOJ6036编码
每个串拆成两个,都插入trie数。
把trie树建出来后,每一条从根到叶子的链上最多只能有一个变量为1。
这是个经典的前后缀优化2-sat建图的套路。
树上的做法也就是边dfs边做而已。
#include<bits/stdc++.h>
#define N 3300000
#define eps 1e-7
#define inf 1e9+7
#define db double
#define ll long long
#define ldb long double
using namespace std;
inline int read()
{
char ch=0;
int x=0,flag=1;
while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*flag;
}
struct edge{int to,nxt;}e[N*4];
int num,head[N];
inline void add(int x,int y){e[++num]=(edge){y,head[x]};head[x]=num;}
stack<int>st;
bool in_stack[N];
int times,bel_cnt,dfn[N],low[N],bel[N];
void tarjan(int x)
{
dfn[x]=low[x]=++times;
st.push(x);in_stack[x]=true;
for(int i=head[x];i!=-1;i=e[i].nxt)
{
int to=e[i].to;
if(!dfn[to])tarjan(to),low[x]=min(low[x],low[to]);
else if(in_stack[to])low[x]=min(low[x],dfn[to]);
}
if(dfn[x]==low[x])
{
bel_cnt++;
int u;
do
{
u=st.top();st.pop();
bel[u]=bel_cnt;
in_stack[u]=false;
}while(x!=u);
}
}
char s[N];
int size,f[N],p[N],pre[N];
struct Trie
{
#define lson son[x][0]
#define rson son[x][1]
#define mid ((l+r)>>1)
vector<int>v[N];
int root=1,cnt=0,tot=1,son[N][2];
void insert(int n,int id)
{
int x=root;
for(int i=1;i<=n;i++)
{
int k=s[i]-'0';
if(!son[x][k])son[x][k]=++tot;
x=son[x][k];
}
v[x].push_back(id);
}
void dfs(int x)
{
int len=v[x].size();
for(int i=0;i<len;i++)
{
p[++cnt]=v[x][i];
pre[p[cnt]]=++size;
f[pre[p[cnt]]]=++size;
f[size]=pre[p[cnt]];
add(p[cnt],pre[p[cnt]]);
add(f[pre[p[cnt]]],f[p[cnt]]);
if(cnt!=1)
{
add(pre[p[cnt-1]],pre[p[cnt]]);
add(f[pre[p[cnt]]],f[pre[p[cnt-1]]]);
add(pre[p[cnt-1]],f[p[cnt]]);
add(p[cnt],f[pre[p[cnt-1]]]);
}
}
if(lson)dfs(lson);if(rson)dfs(rson);cnt-=len;
}
}T;
int main()
{
int n=read();size=n;
num=-1;memset(head,-1,sizeof(head));
for(int o=1;o<=n;o++)
{
scanf("%s",s+1);
int k=0,len=strlen(s+1);
for(int i=1;i<=len;i++)if(s[i]=='?')k=i;
f[o]=++size;f[size]=o;
if(k)
{
s[k]='0';T.insert(len,f[o]);
s[k]='1';T.insert(len,o);
}
else add(f[o],o),T.insert(len,o);
}
T.dfs(T.root);
for(int i=1;i<=size;i++)if(!dfn[i])tarjan(i);
for(int i=1;i<=size;i++)if(bel[i]==bel[f[i]]){printf("NO");return 0;}
printf("YES");
return 0;
}
LOJ6036编码的更多相关文章
- LOJ6036 编码 2-SAT、Trie
传送门 每个串只有一个?,?还只能填0或者1,不难想到2-SAT求解. 一个很暴力的想法是枚举?填0或者1,然后对所有可能的前缀连边.这样边数是\(O(n^2)\)的,需要优化. 看到前缀不难想到Tr ...
- [LOJ6029~6052]雅礼集训 2017 选做
Link 代码可以在loj上看我的提交记录. Day 1 [LOJ6029]市场 对于一次除法操作,若区间内所有数的减少量均相同则可视作区间减法,否则暴力递归下去.显然一个线段树节点只会被暴力递归进去 ...
- 【LOJ6036】编码(2-sat)
[LOJ6036]编码(2-sat) 题面 LOJ 题解 很显然的一个暴力: 枚举每个串中的?是什么,然后把和它有前缀关系的串全部给找出来,不合法的连边处理一下,那么直接跑\(2-sat\)就做完了. ...
- 【LOJ6036】 「雅礼集训 2017 Day4」编码
传送门 LOJ Solution 因为?只有两种可能为0,1,所以就把这两个串搞出来. 那么现在?取0和?取1不能并存,前缀不能并存,所以就是一个\(2-SAT\),现在问题在于这个东西可能会有很多条 ...
- 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)后台解密时,居然解密失败了!经过测试后发 ...
- 使用etree.HTML的编码问题
title: 使用etree.HTML的编码问题 date: 2015-10-07 17:56:47 categories: [Python] tags: [Python, lxml, Xpath] ...
随机推荐
- (转)Shiro学习
(二期)13.权限框架shiro讲解 [课程13]自定义Realm.xmind36.8KB [课程13]用户授权流程.xmind0.2MB [课程13]shiro简介.xmind0.3MB [课程13 ...
- BZOJ 3622 已经没有什么好怕的了
扯淡 看到题目想到二项式反演 然后忘了给求阶乘的时候取模,调了一晚上 真令人窒息 思路 二项式反演 首先二项式反演还有另一种形式(不会证) 设\(G_i\)为有至少i个的方案数量,\(F_i\)为恰好 ...
- Vue.extend构造器和$mount实例构造组件后可以用$destroy()进行卸载,$forceUpdate()进行更新,$nextTick()数据修改
html <div id="app"> </div> <p><button onclick="destroy()"&g ...
- Redis,Memcache比较
简单比较: Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储.memcache只支持简单的K/V类型数据, 不过memcache可以缓存其他东西如图片, ...
- POJ 3279 Fliptile(翻格子)
POJ 3279 Fliptile(翻格子) Time Limit: 2000MS Memory Limit: 65536K Description - 题目描述 Farmer John kno ...
- eclipse中建geoserver源码
概述:本文讲述的是在eclipse中如何构建geoserver源码工程,其中涉及到了jdk,github,marven等. 1.安装git 从(http://git-scm.com/download/ ...
- selenium打开chrome时,出现 "您使用的是不受支持的命令行标记:--ignore-certificate-errors""
from selenium import webdriveroptions = webdriver.ChromeOptions()options.add_experimental_option(&qu ...
- 读书笔记《Spring Boot实战 —— Java EE 开发的颠覆者》
Spring框架是轻量级的企业级开发一站式解决方案 Spring使用简单的POJO Plain Old Java Object 无限制的普通Java对象 Spring Framework Runtim ...
- 《剑指offer》第四十四题(数字序列中某一位的数字)
// 面试题44:数字序列中某一位的数字 // 题目:数字以0123456789101112131415…的格式序列化到一个字符序列中.在这 // 个序列中,第5位(从0开始计数)是5,第13位是1, ...
- ps p图
1. 常用快捷键 ctrl + 单击 选中图层ctrl + j 复制出拷贝的图层 Shift+Alt+S 保存ctrl + s 保存shift + ctrl + alt + s 保存为 web 格式图 ...