CodeForces570D - Tree Requests 【dfs序】

来源:互联网 发布:linux piwik 安装 编辑:程序博客网 时间:2024/05/18 16:13
#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<vector>using namespace std;#define maxn 500010int n,m,t,d,tmp;vector<int> e[maxn],pos[maxn],sta[maxn];char s[maxn];int idx,in[maxn],out[maxn],st,ed;void dfs(int u,int dep){in[u]=++idx;pos[dep].push_back(in[u]);sta[dep].push_back(sta[dep].size()?sta[dep].back()^(1<<(s[u]-'a')):1<<(s[u]-'a'));for(int i=0;i<e[u].size();i++)dfs(e[u][i],dep+1);out[u]=idx;}#define lowbit(x) (x&-x)int count(int x){int ret = 0;while(x){ret++;x-=lowbit(x);}return ret;}int main(void){scanf("%d%d",&n,&m);for(int i=2;i<=n;i++){scanf("%d",&t);e[t].push_back(i);}getchar();gets(s+1);dfs(1,1);for(int i=1;i<=m;i++){scanf("%d%d",&t,&d);st = lower_bound(pos[d].begin(),pos[d].end(),in[t])-pos[d].begin();ed = upper_bound(pos[d].begin(),pos[d].end(),out[t])-pos[d].begin()-1;if(ed<st){puts("Yes");continue;}//t的子树中没有深度为d的结点。tmp = sta[d][ed];if(st)tmp^=sta[d][st-1];if(count(tmp)<=1)puts("Yes");else puts("No");}return 0;}
dfs序+异或 状态压缩
1 0