Advertisement
RaFiN_

dsu on tree

Apr 26th, 2019
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.54 KB | None | 0 0
  1. /*dsu on tree */
  2.  
  3. int n,big[MAX];vi v[MAX];char c[MAX];
  4.  
  5. int ans[MAX];int vis[MAX];vector<pii>ques[MAX];
  6.  
  7. int Sz[MAX],col[MAX][30];int cnt,maxi;vi v2;char str[MAX];
  8.  
  9.  
  10.  
  11. void dfs2(int s,int p){
  12.     Sz[s] = 1;
  13.     for(auto it : v[s]){
  14.         if(it==p)continue;
  15.         dfs2(it,s);
  16.         Sz[s]+=Sz[it];
  17.     }
  18. }
  19.  
  20. void add(int s,int p,int val,int depth){
  21.     col[depth][c[s]-96]+=val;
  22.     for(auto it : v[s]){
  23.         if(p==it||big[it])continue;
  24.         add(it,s,val,depth+1);
  25.     }
  26. }
  27.  
  28.  
  29. void dfs(int s,int p,int keep,int depth){
  30.     int b = -1,mx = -1;
  31.     for(auto it : v[s]){
  32.         if(Sz[it]>mx&&it!=p){
  33.             mx = Sz[it];
  34.             b = it;
  35.         }
  36.     }
  37.  
  38.     for(auto it : v[s]){
  39.         if(it!=b&&it!=p)dfs(it,s,0,depth+1);
  40.     }
  41.     if(b!=-1)dfs(b,s,1,depth+1),big[b] = 1;
  42.     add(s,p,1,depth);
  43.     for(auto it : ques[s]){
  44.         int jor = 0,bijor = 0;
  45.         for(char ch = 'a';ch<='z';ch++){
  46.             if(col[it.ff][ch-96]&1)bijor++;
  47.             else jor++;
  48.         }
  49.         if(bijor<=1)ans[it.ss] = 1;
  50.         else ans[it.ss] = 0;
  51.     }
  52.     //cout<<s<<" balsal "<<maxi<<endl;
  53.     if(b!=-1)big[b] = 0;
  54.     if(!keep)add(s,p,-1,depth),cnt=0,maxi=0;
  55.  
  56.  
  57.  
  58.  
  59. }
  60.  
  61.  
  62. int main()
  63. {
  64.    // booster()
  65.     ///read("input.txt");
  66.     scani(n);
  67.     int q;
  68.     scani(q);
  69.     string st;
  70.     for(int i = 0;i<n-1;i++){
  71.         int a;
  72.         scani(a);
  73.         v[a].pb(i+2);
  74.     }
  75.     scanf(" %s",str);
  76.     st = str;
  77.     for(int i = 0;i<n;i++)c[i+1] = st[i];
  78.     for(int i = 0;i<q;i++){
  79.         int a,b;
  80.         scani2(a,b);
  81.         ques[a].pb(pii(b,i+1));
  82.     }
  83.     dfs2(1,0);
  84.     dfs(1,0,1,1);
  85.     for(int i = 1;i<=q;i++){
  86.         if(ans[i])puts("Yes");
  87.         else puts("No");
  88.     }
  89.  
  90.  
  91.     return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement