zoukankan      html  css  js  c++  java
  • CSP2019 括号树

    Description:

    给定括号树,每个节点都是 () ,定义节点的权值为根到该节点的简单路径所构成的括号序列中不同合法子串的个数(子串需要连续,子串所在的位置不同即为不同。)与节点编号的乘积,求所有节点权值的异或和。

    Solution:

    闻到一股深深的 stack 气息。

    懒得写了

    大概就是手玩一下然后放到栈里乱搞一通。

    Code:

    #include<bits/stdc++.h>
    
    using namespace std;
    typedef long long ll;
    
    const int N = 5e5+1;
    int n;
    char s[N];
    int fa[N],st[N],top;
    ll sum[N],ans[N];
    ll fin;
    
    struct edge
    {
        int nxt;
        int to;
    }e[N];
    int h[N],cnt;
    
    void add(int u,int v)
    {
        e[++cnt].nxt=h[u];
        e[cnt].to=v;
        h[u]=cnt;
    }
    
    void dfs(int u)
    {
        int flag=0;
        if(s[u]==')')
        {
            if(!top) goto here;
            flag=st[top];
            --top;
            sum[u]=sum[fa[flag]]+1;
        }
        else if(s[u]=='(')
        {
            st[++top]=u;
        }
        here:;
        ans[u]=ans[fa[u]]+sum[u];
        for(int i=h[u];i;i=e[i].nxt)
            dfs(e[i].to);
        if(flag) st[++top]=flag;
        else if(top) --top;
    }
    
    signed main()
    {
        scanf("%d",&n);
    	scanf("%s",s+1);
        for(int i=2;i<=n;++i)
        {
            scanf("%d",&fa[i]);
            add(fa[i],i);
        }
        dfs(1);
        for(int i=1;i<=n;++i)
        {
            fin^=ans[i]*ll(i);
        }
        printf("%lld",fin);
        return 0;
    }
    
  • 相关阅读:
    2014/4/9-最近所想
    DNS坑爹呢?!
    c#委托使用
    sqlserver 获取一个月有多少天
    定时提醒模型
    sqlserver导入dbf文件
    json对象中根据主键判断是否有重复数据
    差异备份与恢复
    html编码和解码
    opendatasource问题
  • 原文地址:https://www.cnblogs.com/oierwyh/p/12267566.html
Copyright © 2011-2022 走看看