loj#6036 编码
2024-09-05 21:17:02
分析
考虑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 ;
}
最新文章
- SVG:linearGradient渐变在直线上失效的问题解决方案
- Pyqt 国际化多语言支持
- Power Strings 分类: POJ 串 2015-07-31 19:05 8人阅读 评论(0) 收藏
- NOSQL的应用,Redis/Mongo
- 使用公钥登录SSL
- [liu yanling]常用的测试工具
- ubuntu10.04版本下android源码的编译
- (转)ASP.NET里面简单的记住用户名和密码
- 完整的拆分nginx访问日志
- 如何实现select组件的选择输入过滤作用
- Python中的各种装饰器详解
- freemarker自定义标签报错(七)
- 深入理解Java内存(图解堆栈)
- XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Saratov
- 【LOJ#10002】喷水装置
- DBeaver入门
- 装系统w7、ubuntu、centos等系统(一)
- Android : 修改内核源码 and 编译、打包成新的boot.img
- 項目当中使用的easyui的模板crud页面
- final发布简评