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] ...
随机推荐
- fedora安装了phpmyadmin后, mariadb无法启动?
参考:http://www.linuxidc.com/Linux/2015-10/123945.htm where, which, when,等不但可以用在从句中, 而且可以用在 动词不定式中, 如: ...
- CF767C 记录错误
链接 https://codeforces.com/contest/767/problem/C 思路 之所以把这个题放进来,是因为要记录错误 情况不止一种 所以答案存储就是>=2了 代码 #in ...
- hihoCoder week12 刷油漆
题目链接: https://hihocoder.com/contest/hiho12/problem/1 给出一棵树 每个节点的价值 求以1为根的树中,选取m个相联通的节点的最大价值和 #includ ...
- Centos 安装R
1 下载R源代码 原码下载地址https://cloud.r-project.org/https://cloud.r-project.org/src/base/R-3/R-3.4.2.tar.gz 2 ...
- 不能安装64位office提示已安装32位的
安装64位office办公软件的时候提示已经安装32位的office办公软件所以无法继续安装,但实际上之前安装的32位的office办公软件已经卸载了.问题现象截图如下: 从问题描述中,我们其实已经能 ...
- 使用JAX-WS开发WebService
Axis2和CXF是目前流行的Webservice框架,这两个框架都属于重量级框架.相对而言,JAX-WS RI是一个轻量级的框架.开发WebService只需要很简单的几个步骤:写接口和实现-> ...
- Windows10状态栏右下角的上升三角号没有了
闲着没事装了360和电脑管家,捣鼓了下里面的功能,好像是弄了桌面整理和主题之后出现了这个问题,刚开始还以为因为清理卸载软件把系统的这项功能给卸载了,其实原因很简单,相信看完解决这个问题的方案你就明白了 ...
- Thymeleaf 模板引擎技术
引入Thymeleaf: <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf. ...
- 最受欢迎的前端框架 —— Bootstrap学习
Bootstrap是Twitter的Mark Otto和Jacob Thornton开发的,是目前最受欢迎的前端框架,它简单灵活,使得Web前端开发更加快捷方便. 首先,要基本掌握Bootstrap框 ...
- hdu 6069 Counting Divisors 筛法
Counting Divisors Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...