2023.2.6
CF1288F Red-Blue Graph
CF1286F Harry the Potter
瞎扯:套路考虑而操作形成的图,具体来说应该是一个森林,因为成环不优。
考虑一棵树,则树上的点应当是可以自己解决的。
ARC122F Donation
HNOI2018 寻宝游戏
十分有趣的题目。考虑对于询问串中的一个 \(1\),考虑在最后一次出现或 \(1\) 之后就只能出现与 \(1\) 和或 \(0\) 了。
对于询问串中的一个 \(0\),最后一次出现与 \(0\) 之后就只能出现与 \(1\) 和或 \(0\) 了。
这时我们联想到,如果把与看成 \(1\) 或看成 \(0\),从后往前把操作和原数组分别看成两个二进制数 \(x,y\),则若应为 \(1\) 则限制为 \(x>y\),否则限制为 \(x\leqslant y\)。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+10;
const int mod=1e9+7;
#define inf 1e9
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
const int N=5005;string S[N],T;
int n,m,q,ch[maxn][2],pos[N],cnt,dfn[maxn],val[maxn],ti,pw[N];
inline void dfs(int x,int v,int dep){
dfn[x]=++ti;val[ti]=v;if(dep==n)return;//void(printf("val=%d ti=%d\n",v,ti));
if(ch[x][0])dfs(ch[x][0],v,dep+1);
if(ch[x][1])dfs(ch[x][1],(v+pw[n-dep-1])%mod,dep+1);
}
int main(){
n=read(),m=read(),q=read();pw[0]=1;
for(int i=1;i<=n;i++)pw[i]=2ll*pw[i-1]%mod;
for(int i=1;i<=n;i++)cin>>S[i];//puts("\n");
for(int i=1;i<=m;i++){
int u=0;
for(int j=n;j>=1;--j){
int t=S[j][i-1]-'0';
// printf("%d",t);
if(!ch[u][t])ch[u][t]=++cnt;
u=ch[u][t];
}pos[i]=u;//puts("");
}dfs(0,0,0);val[ti+1]=pw[n];
for(int i=1;i<=q;i++){
cin>>T;int l=0,r=ti+1;
for(int j=1;j<=m;j++){
int t=T[j-1]-'0';
if(t)r=min(r,dfn[pos[j]]);
else l=max(l,dfn[pos[j]]);
}if(l>r)puts("0");
else printf("%d\n",(val[r]-val[l]+mod)%mod);
}
return 0;
}

浙公网安备 33010602011771号