每个串拆成两个,都插入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. 开源代码中的autogen.sh干了些什么?

    答:重新根据当前所处环境生成新的configure 分析脚本都做了些什么? 1. 指定make工具 MAKE=gmake or MAKE=make 2. 执行autoreconf autoreconf ...

  2. fedora23 桌面工具栏fedy, 桌面美化 allow: 2'lau不是2'l2u

    ## Sudoers allows particular users to run various commands as ## the root user, without needing the ...

  3. CodeForces 509C Sums of Digits(贪心乱搞)题解

    题意:a是严格递增数列,bi是ai每一位的和,告诉你b1~bn,问你怎样搞才能让an最小 思路:让ai刚好大于ai-1弄出来的an最小.所以直接模拟贪心,如果当前位和前一个数的当前位一样并且后面还能生 ...

  4. kafka丢失和重复消费数据

    Kafka作为当下流行的高并发消息中间件,大量用于数据采集,实时处理等场景,我们在享受他的高并发,高可靠时,还是不得不面对可能存在的问题,最常见的就是丢包,重发问题. 1.丢包问题:消息推送服务,每天 ...

  5. MD5+salt 工具类

    import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.securit ...

  6. 那些年我们一起用过的 PHP 函数(一)

    用这个帖子记录一下 PHP 中比较常用的函数以及使用过程中需要注意的点,此贴持续更新 1.strpos() 函数     首先,我们知道 strpos() 函数是用于查找一个字符串在另一个字符串第一次 ...

  7. el-cascader 级联选择器使用时遇到的一些问题

    Element UI Cascader官网文档 <el-form-item label="章节" style="margin-right: 64px"&g ...

  8. _itemmod_gem_remove

    该表可配置以一定代价移除宝石,移除后获得该宝石 `entry`宝石ID `reqId` 需求ID `chance`几率 `comond` 备注

  9. Centos6.8安装redis(一)

    最近有在学习会话共享的配置,其中一种呢是 nginx+redis+tomcat 的会话共享配置,在记录此会话共享配置之前呢先记录下redis等的安装.这篇先简单记录下redis的安装,是其中一种方式, ...

  10. JTopo使用心得

    因为工作关系,最近用到了拓扑图,找了一溜工具后,发现了这个--JTopo,纯国产而且免费 当然了如果你英文水平足够好的话.也可以看看这些英文的做拓扑图的工具,以下网站出自知乎回答:开源HTML5 绘图 ...