hash
题 意:中文题面。
输入样例:
1 4
4 1 2 3 4
1 2 3 2
1 2
2 3
1 4
输出样例:
YES
思 路:字符串hash+dfs。
收 获:第一道字符串hash的题目。感觉字符串hash很强大
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e3+5;
const int N = 2e5+5;
struct node{
int to,value;
};
vector<node> edge[N];
unordered_map<int,ull>mp[N];
ull base = 13131;
ull val[N];
int n,m;
bool flag;
void dfs(int u,int fa,ull tmp,int depth){
if(!flag) return ;
for(int i=0;i<edge[u].size();i++){
int v = edge[u][i].to;
if(v == fa) continue;
ull res = tmp*base + val[v]; //dfs不要改变参数
if(!mp[depth+1][res])flag = false;
if(!flag)return ;
dfs(v,u,res,depth+1);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int k;scanf("%d",&k);
ull tmp = 0,x;
for(int j=1;j<=k;j++){
scanf("%llu",&x);
tmp = tmp*base + x;
mp[j][tmp] = 1; //储存所有字符串的前j个字符的hash值。
}
}
for(int i=1;i<=m;i++) scanf("%llu",&val[i]);
for(int i=1;i<m;i++){
int u,v;
scanf("%d%d",&u,&v);
edge[u].push_back(node{v,val[v]});
edge[v].push_back(node{u,val[u]});
}
flag = true;
dfs(1,0,val[1],1);
if(flag){
printf("YES\n");
}else{
printf("NO\n");
}
return 0;
}