每个串拆成两个,都插入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. ununtu 18.04 163 mirror

    deb http://mirrors.163.com/ubuntu/ bionic main restricted deb http://mirrors.163.com/ubuntu/ bionic- ...

  2. [关于前端数据] - serialize()的使用

    虽然是拼接字符串,但是也能通过post方式提交 $("#signUpForm").serialize() 结果 controller照样使用实例接收数据即可

  3. 【.Net】在windows server 2016 和Windows10这些server上安装.net fw3.5

    一般就是打开server manager. 一直next到add feature 讲net3.5勾选 发现需要指定一个路径是什么 source\sxs之类的 下载microsoft-windows-n ...

  4. Linux命令1——a

    addUser: -c:备注 -d:登陆目录 -e:有效期限 -f:缓冲天数 -g:组 -b:用户目录 -G:附加组 -s:制定使用默认的shell -u:指定用户ID -r:建立系统账号 -M:不自 ...

  5. 洛谷P1164 小A点菜 DP入门

    原题传输门>>https://www.luogu.org/problem/show?pid=1164<< 前几天开始联系DP的,一路水题做到这,发现这题套不了模板了QAQ 在大 ...

  6. 单域名下多子域名同时认证HTTPS

    参考: http://blog.csdn.net/wzj0808/article/details/53401101 http://www.cnblogs.com/silin6/p/5931640.ht ...

  7. 【selenium2】【unittest】

    #栗子 from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver ...

  8. JaveWeb 公司项目(1)----- 使Div覆盖另一个Div完成切换效果

    最近在做网页,用的是CSS+DIV的布局方法,搭建了一个简易的界面,大体上分为三个部分,如图所示: 左侧的为主功能导航栏,右侧是具体的功能实现,下方是固定的版权声明,单击左边不同的导航按钮,在div中 ...

  9. javascript 获得以秒计的视频时长

    <!DOCTYPE html> <html> <body> <h3>演示如何访问 VIDEO 元素</h3> <video id=&q ...

  10. SqlServer中 将某个表的某个字段改个默认值

    ALTER TABLE [dbo].[表名] ADD CONSTRAINT [DF_表名_列名] DEFAULT ((默认值)) FOR [列名] ALTER TABLE QA_API ADD CON ...