博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LOJ6036编码
阅读量:5322 次
发布时间:2019-06-14

本文共 1637 字,大约阅读时间需要 5 分钟。

每个串拆成两个,都插入trie数。

把trie树建出来后,每一条从根到叶子的链上最多只能有一个变量为1。
这是个经典的前后缀优化2-sat建图的套路。
树上的做法也就是边dfs边做而已。

#include
#define N 3300000#define eps 1e-7#define inf 1e9+7#define db double#define ll long long#define ldb long doubleusing 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
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
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

转载于:https://www.cnblogs.com/Creed-qwq/p/10448467.html

你可能感兴趣的文章
Css让文字自适应Table宽度[转]
查看>>
[Javascript] Flattening nested arrays: a little exercise in functional refactoring
查看>>
练习10-1 使用递归函数计算1到n之和(10 分
查看>>
使用maven构建多模块项目,分块开发
查看>>
Oracle MySQL yaSSL 不明细节缓冲区溢出漏洞2
查看>>
jffs2镜像制作
查看>>
windows编程ASCII问题
查看>>
.net webService代理类
查看>>
C#高级编程笔记(一)
查看>>
Code Snippet
查看>>
MFC模态对话框程序不响应OnIdle
查看>>
Node.js Express项目搭建
查看>>
zoj 1232 Adventure of Super Mario
查看>>
Oracle 序列的应用
查看>>
1201 网页基础--JavaScript(DOM)
查看>>
组合数学 UVa 11538 Chess Queen
查看>>
uva 10004 - Bicoloring
查看>>
oracle job
查看>>
Redis常用命令
查看>>
C语言 · Sine之舞
查看>>