分析

考虑trie+2sat

每次将?=0和?=1的分别插入

插入串时将这个点的选择状态和前缀的选择状态连关系边

注意串结束时建一个新点表示当前串

最后跑2sat即可

代码

#include<bits/stdc++.h>
using namespace std;
#define a(x) x<<1
#define b(x) x<<1|1
#define pb push_back
stack<int>a;
string s[];
vector<int>v[];
int id[],siz[],n,m;
int trie[][],cnt,bel[];
int low[],dfn[],is[],T,sum;
inline bool cmp(int a,int b){return siz[a]<siz[b];}
inline void add(int x,int y){v[x].pb(y),v[y^].pb(x^);}
inline void tarjan(int x,int fa){
dfn[x]=low[x]=++T;
a.push(x);
is[x]=;
for(int i=;i<v[x].size();i++)
if(v[x][i]!=fa){
if(!dfn[v[x][i]]){
tarjan(v[x][i],x);
low[x]=min(low[x],low[v[x][i]]);
}else if(is[v[x][i]]){
low[x]=min(low[x],dfn[v[x][i]]);
}
}
if(low[x]==dfn[x]){
sum++;
while(){
int u=a.top();
a.pop();
is[u]=;
bel[u]=sum;
if(u==x)break;
}
}
return;
}
inline void ins(int i,int x){
int p=,wh,la=;
for(int j=;j<siz[i];j++){
wh=(s[i][j]-'');
if(!trie[p][wh])trie[p][wh]=++cnt;
la=p,p=trie[p][wh],add(x,a(p));
}
trie[la][wh]=++cnt;
add(x,b(cnt)),add(a(cnt),a(p));
return;
}
int main(){
int i,j,k,ok;
scanf("%d",&n);cnt=n;
for(i=;i<=n;i++){
cin>>s[i];
id[i]=i;
siz[i]=s[i].length();
}
sort(id+,id+n+,cmp);
for(int _=;_<=n;_++){
i=id[_],ok=;
for(j=;j<siz[i];j++)
if(s[i][j]=='?'){
s[i][j]='',ins(i,a(i));
s[i][j]='',ins(i,b(i));
ok=;
break;
}
if(!ok){
ins(i,a(i));
add(b(i),a(i));
}
}
for(i=;i<=(cnt<<|);i++)if(!dfn[i])tarjan(i,);
for(i=;i<=cnt;i++)
if(bel[a(i)]==bel[b(i)]){
puts("NO");
return ;
}
puts("YES");
return ;
}

loj#6036 编码的更多相关文章

  1. Loj 6036 「雅礼集训 2017 Day4」编码 - 2-sat

    题目传送门 唯一的传送门 题目大意 给定$n$个串,每个串只包含 ' .问是否可能任意两个不同的串不满足一个是另一个的前缀. 2-sat的是显然的. 枚举每个通配符填0还是1,然后插入Trie树. 对 ...

  2. LOJ #6036.「雅礼集训 2017 Day4」编码 Trie树上2-sat

    记得之前做过几道2-sat裸体,以及几道2-sat前缀优化建图,这道题使用了前缀树上前缀树优化建图.我们暴力建图肯定是n^2级别的,那么我们要是想让边数少点,就得使用一些骚操作.我们观察我们的限制条件 ...

  3. 【LOJ#6036】[雅礼集训2017Day4]编码

    传送门 题意简述 判定 n 个含 ? 字符的二进制串是否存在一种把 0/1 填入 ? 中的方案使得任意两个串不具有前缀关系. (一个串最多一个 ?) Sol 二进制串 ,并且一个串最多一个 '?' 很 ...

  4. 2-sat问题学习记录

    如果你不知道什么是sat问题,请看以下问答. Q:sat问题是什麽?A:首先你有n个布尔变量,然后你有一个关于这n个布尔变量的布尔表达式,问你,如果让你随意给这n个布尔变量赋值,这个布尔表达式能否成立 ...

  5. 天气预报API(二):全球城市、景点代码列表(“旧编码”)

    说明 2016-12-10 补充 (后来)偶然发现中国天气网已经有城市ID列表的网页...还发现城市编码有两种,暂且称中国天气网这些编码为旧标准"旧编码"的特征是 9个字符长度; ...

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

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

  7. 雅礼集训 2017 Day4 编码(2-sat)

    题意 题目链接:https://loj.ac/problem/6036 思路 ​ 首先,有前缀关系的串不能同时存在,不难看出这是一个 2-sat 问题.先假设所有串都带问号,那么每一个字符串,我们可以 ...

  8. Python编码记录

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

  9. URL安全的Base64编码

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

随机推荐

  1. 在django中使用循环与条件语言

    {% if not Article_type_id %} <li class="active"><a href="/">全部</a ...

  2. C#配合大数据开发,nest.dll的使用

    一,添加Nest.dll引用 结果如下多了如下DLL: Elasticsearch.Net.dll,Nest.dll 二,上代码: using Common.EsModel; using Elasti ...

  3. MySQL索引原则和慢查询优化步骤

    建索引的几大原则 1.最左前缀匹配原则,mysql会一直向右匹配直到遇到范围查询(>.<.between.like)就停止匹配. 2.=和in可以乱序,比如a = 1 and b = 2 ...

  4. 在cmd下用cd怎么进不了其他的盘

    你当前就是在C盘目录下的,可以切换到别的盘比如D:,然后在切换E:!然后可以切换C:,然后可以用cd\回到根目录. cd是打开文件根目录里面文件夹的,比如C:目录下可以cd Windows打开Wind ...

  5. ## ucore Lab0 一些杂记

    ucore Lab0 一些杂记 前一阵子开始做 MIT 6.828,做了两三个实验才发现清华的 ucore 貌似更友好一些,再加上前几个实验也与6.828 有所重叠,于是决定迁移阵地. 文章计划分两类 ...

  6. 关于ResultSet中getDate\getTime\getTimestamp的区别的记录

    getDate() 返回时间的年月日 getTime() 返回时间的时分秒 getTimestamp () 返回时间的年月日 时分秒

  7. thinkphp5 select对象怎么转数组?

    DB操作返回是数组.模型直接操作返回是对象 对象类型转换数组打开 database.php 增加或修改参数'resultset_type' => '\think\Collection',即可连贯 ...

  8. AlphaStar: Mastering the Real-Time Strategy Game StarCraft II 博客要点

    original blog:  https://deepmind.com/blog/alphastar-mastering-real-time-strategy-game-starcraft-ii S ...

  9. fhq_treap || BZOJ 3223: Tyvj 1729 文艺平衡树 || Luogu P3391 【模板】文艺平衡树(Splay)

    题面: [模板]文艺平衡树(Splay) 题解:无 代码: #include<cstdio> #include<cstring> #include<iostream> ...

  10. mysql merge引擎分表

    ---------------------创建表一--------------------------------------DROP TABLE a1;CREATE TABLE `a1` ( `id ...