E题真的是树形DP
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n;
vector<int> e[N];
char s[N];
bool dfs(int u,int fa)
{
char ch=s[u],c;
if(ch=='d')c='p';
else c='d';
for(auto v:e[u])
{
if(v==fa)continue;
if(s[v]=='?')s[v]=c;
else if(s[v]==ch)return false;
if(!(dfs(v,u)))return false;
}
return true;
}
int main()
{
cin>>n;
scanf("%s",s+1);
for(int i=1;i<n;i++)
{
int u,v;
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
int t=0;
for(int i=1;i<=n;i++)
{
if(s[i]!='?')
{
t=i;
break;
}
}
if(t==0)
{
t=1;
s[1]='d';
}
if(dfs(t,-1))cout<<s+1;
else cout<<-1;
return 0;
}