每个串拆成两个,都插入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编码的更多相关文章

  1. LOJ6036 编码 2-SAT、Trie

    传送门 每个串只有一个?,?还只能填0或者1,不难想到2-SAT求解. 一个很暴力的想法是枚举?填0或者1,然后对所有可能的前缀连边.这样边数是\(O(n^2)\)的,需要优化. 看到前缀不难想到Tr ...

  2. [LOJ6029~6052]雅礼集训 2017 选做

    Link 代码可以在loj上看我的提交记录. Day 1 [LOJ6029]市场 对于一次除法操作,若区间内所有数的减少量均相同则可视作区间减法,否则暴力递归下去.显然一个线段树节点只会被暴力递归进去 ...

  3. 【LOJ6036】编码(2-sat)

    [LOJ6036]编码(2-sat) 题面 LOJ 题解 很显然的一个暴力: 枚举每个串中的?是什么,然后把和它有前缀关系的串全部给找出来,不合法的连边处理一下,那么直接跑\(2-sat\)就做完了. ...

  4. 【LOJ6036】 「雅礼集训 2017 Day4」编码

    传送门 LOJ Solution 因为?只有两种可能为0,1,所以就把这两个串搞出来. 那么现在?取0和?取1不能并存,前缀不能并存,所以就是一个\(2-SAT\),现在问题在于这个东西可能会有很多条 ...

  5. Python编码记录

    字节流和字符串 当使用Python定义一个字符串时,实际会存储一个字节串: "abc"--[97][98][99] python2.x默认会把所有的字符串当做ASCII码来对待,但 ...

  6. URL安全的Base64编码

    Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...

  7. myeclipse学习总结一(在MyEclipse中设置生成jsp页面时默认编码为utf-8编码)

    1.每次我们在MyEclispe中创建Jsp页面,生成的Jsp页面的默认编码是"ISO-8859-1".在这种情况下,当我们在页面中编写的内容存在中文的时候,就无法进行保存.如下图 ...

  8. Base64编码

    Base64编码 写在前面 今天在做一个Android app时遇到了一个问题:Android端采用ASE对称加密的数据在JavaWeb(jre1.8.0_7)后台解密时,居然解密失败了!经过测试后发 ...

  9. 使用etree.HTML的编码问题

    title: 使用etree.HTML的编码问题 date: 2015-10-07 17:56:47 categories: [Python] tags: [Python, lxml, Xpath] ...

随机推荐

  1. CodeChef - MRO Method Resolution Order(打表)

    题意:有一种关系叫继承,那么继承父类的同时也会继承他的一个函数f,能继承任意多个父类或不继承,但不能继承自己的子类.现在规定一个列表,这个列表必须以1~N的顺序排列,并且父类不会排在子类后面,1含有一 ...

  2. 关于 RabbitMQ 的 Dead-Letters-Queue “死信队列”

      来自一个队列的消息可以被当做‘死信’,即被重新发布到另外一个“exchange”去,这样的情况有: 消息被拒绝 (basic.reject or basic.nack) 且带 requeue=fa ...

  3. How Flyway works

    The easiest scenario is when you point Flyway to an empty database. It will try to locate its schema ...

  4. 用RAR将多个文件夹一次性压缩为多个对应zip文件

    选中要压缩的所有文件夹.右键,选“添加到压缩文件...”,弹出的菜单如下图: 点击菜单栏“文件”.在“把每个文件都单独压缩文件中”选中,才可以单独创建压缩.如下图

  5. StringBuilder的三种删除方法比较

    分别用一千万次循环来比较StringBuilder的三种删除方法所用时间 未避免偶然性,再循环一百次来比较总时间 --主类 public class StringBuilderRemove { pub ...

  6. HDU 1251 统计难题(字典树模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意:给出一些单词,然后有多次询问,每次输出以该单词为前缀的单词的数量. 思路: 字典树入门题. #inc ...

  7. string截取、替换、查找子串函数,find_first_of 用法

    1. 截取子串 s.substr(pos, n) 截取s中从pos开始(包括0)的n个字符的子串,并返回 s.substr(pos) 截取s中从从pos开始(包括0)到末尾的所有字符的子串,并返回 2 ...

  8. React native中的组建通知通信:

    有这么一个需求,在B页面pop()回到A页面,需要A页面执行刷新,那么我们可以采用以下方法: 1:在A页面Push到B页面中,加上一个A页面中的刷新函数做为参数,然后在B页面中在pop()函数封装后通 ...

  9. win10,python3.6,django2.0.3,项目基本命令

    1.django-admin startproject project_name(创建项目) 2.python manage.py startapp appname(创建应用) 3.python ma ...

  10. 使用Rancher的RKE部署Kubernetes要点

    简要说明: RKE (Rancher Kubernetes Engine)是RancherLabs提供的一个工具,可以在裸机.虚拟机.公私有云上快速安装Kubernetes集群.整个集群的部署只需要一 ...