Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
1804 | 18级张钰晨 | 【S】T1最大后缀值个数 | C++ | 运行超时 | 70 | 2070 MS | 39360 KB | 811 | 2020-11-16 08:38:56 |
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+5; inline int read(){ int x=0,f=1,ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-48;ch=getchar();} return x*f; } int n,h[maxn],e_cnt,fa[maxn],p[maxn]; struct node{int num,nxt;}dfn[maxn]; struct edge{int t,nxt;}e[maxn<<1]; void add_edge(int f,int t){ e[++e_cnt]=(edge){t,h[f]}; h[f]=e_cnt; } void dfs(int x){ int tmp=fa[x]; while(p[tmp]<p[x]&&dfn[tmp].num)tmp=dfn[tmp].nxt; dfn[x]=(node){dfn[tmp].num+1,tmp}; for(int i=h[x];i;i=e[i].nxt)dfs(e[i].t); } int main(){ n=read(); for(int i=2;i<=n;i++)fa[i]=read(),add_edge(fa[i],i); for(int i=1;i<=n;i++)p[i]=read(); dfs(1); for(int i=1;i<=n;i++)printf("%d ",dfn[i].num);printf("\n"); return 0; }