当你在群内开始代码接龙
  • 板块灌水区
  • 楼主yijan
  • 当前回复19
  • 已保存回复19
  • 发布时间2019/12/7 11:49
  • 上次更新2024/7/20 14:48:02
查看原帖
当你在群内开始代码接龙
63398
yijan楼主2019/12/7 11:49

括号树 一次过编译,两次ac(大雾

SPC_STC77PLUO9__LV8_TGK.png

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10
;
int n;
vector<int> E[500050];
char str[maxn];
typedef long long ll;
ll ans[maxn];
int stk[maxn] , top;
void dfs(int u , int fa , int zzhakioi);
void ins(int val);
void dfs(int u,int fa,int zzhakioi) {
	int typ,tmp;
	// 没有注释毒瘤
    // typ 表示是否删掉栈顶元素 或 插入一个元素,tmp 表示若删除 删掉的元素
    /*
    */
    // 用 ans 存 fa
    // 草
    // 对了
    //  我们 maxn 开的 1e6
    // 对
    // maxn == 1e6
    // 所以用 500001 ~ 1000000 存 fa
    // 可以
    //不愧是你
    ans[u + 500000] = fa;
    // Orzwkr
    // [图片]
    if( str[u] == '(' ) {
        //orzzh
        /*
        typ = 2;
        */
        typ = 2;
        stk[++top]=u;
    }
    else{
        // [图片]
        if ( top ) {
            typ = 1;
            tmp = stk[top];
            -- top;
            ans[u] = ans[ans[tmp+500000]] + 1;
            // [图片]
        }
        else { typ = 0; } }
    for( int v : E[u] ) {
        if ( v != fa ) {
            dfs( v , u , zzhakioi);
        }
        /*orcjz
        */}
        if(typ == 1) {
            /*orZ*/
            /*OR2*/
            stk[++top]=tmp;
        } else {
            //cout<<"zhumlakioi"<<endl;
            if( typ == 2 ) {
                -- top;
            }}
}
void getans(int u,int fa,ll zzhakioi) {
    zzhakioi += ans[u];
    ans[0] ^= 1ll * zzhakioi * u;
    for ( auto v : E[u]) {
        if( v == fa ) continue;
        getans(v,u,zzhakioi);
    }
}
int main() {
    int n; cin >> n;
    //orz
    scanf("%s",str + 1);
    for ( int i = 2;i <= n; ++ i )
    {
        int u;
        cin >> u;
        E[u].push_back(i) , E[i].push_back( u );
    }
    dfs( 1 , 0 , 1 );
    getans( 1, 0, 0 );
    cout << ans[0] << endl;
    return -0; }
2019/12/7 11:49
加载中...