[题解]CF1223F Stack Exterminable Arrays

CCF 出的原题观摩一下。

思路

首先可以用一个 Trie 来维护。

在这里对本文中的一些变量做一下说明。

  1. p 表示当前维护的 Trie 中,指向的元素编号。
  2. ti 表示在 Trie 中编号为 i 的元素在原序列中的值。
  3. fi 表示在 Trie 中编号为 i 的元素在 Trie 中的父节点。
  4. vi 表示在 Trie 中编号为 i 被遍历的次数。

考虑每一次将一个数 ai 加入 Trie 的时候需要做什么操作。

如果当前在 Trie 中指向的节点 tpai 相等,说明可以进行合并, 那么直接将 p 跳到 fp 即可;否则需要新开一个节点 v,接在 p 的下方,并将 p 更新到 v 上。

然后在更新 p 之后,要将 vp1

考虑如何统计答案。发现点 p 被遍历过 2 次时,答案会加 13 次,答案会加 2;以此类推。

这是因为当 vp>1 时,说明 p 节点已经可以被合并 vp1 次了,所以直接加 vp1 即可。

注意:在代码中为了优美,将 vp 初值设为了 1

但是用普通的 Trie 显然是过不了的,因为 Trie 的空间复杂度在本题中会变为 Θ(n2),所以直接开一个 umap 即可。

复杂度为 Θ(nlogn),实测跑得飞快。

Code

#include <bits/stdc++.h>  
#define re register  
#define ll long long  
  
using namespace std;  
  
const int N = 3e5 + 10;  
int T,n,p,idx;  
ll ans;  
int arr[N];  
  
struct node{  
    ll val;  
    int u,fa;  
    unordered_map<int,int> son;  
}tr[N];  
  
inline int read(){  
    int r = 0,w = 1;  
    char c = getchar();  
    while (c < '0' || c > '9'){  
        if (c == '-') w = -1;  
        c = getchar();  
    }  
    while (c >= '0' && c <= '9'){  
        r = (r << 3) + (r << 1) + (c ^ 48);  
        c = getchar();  
    }  
    return r * w;  
}  
  
inline void solve(){  
    ans = 0;  
    p = idx = 1;  
    n = read();  
    for (re int i = 1;i <= n;i++){  
        tr[i].val = tr[i].u = tr[i].fa = 0;  
        tr[i].son.clear();  
        arr[i] = read();  
    }  
    for (re int i = 1;i <= n;i++){  
        if (arr[i] == tr[p].u) p = tr[p].fa;  
        else{  
            int v;  
            if (!tr[p].son.count(arr[i])){  
                tr[p].son[arr[i]] = v = ++idx;  
                tr[v] = {-1,arr[i],p};  
            }  
            else v = tr[p].son[arr[i]];  
            p = v;  
        }  
        tr[p].val++;  
        ans += tr[p].val;  
    }  
    printf("%lld\n",ans);  
}  
  
int main(){  
    T = read();  
    while (T--) solve();  
    return 0;  
}  

作者:WaterSun

出处:https://www.cnblogs.com/WaterSun/p/18264793

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   WBIKPS  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示