#Trie#AGC044 C - Strange Dance
题意
有 个人在绕圈圈跳舞。我们从任意一个人开始,给这些人环绕标号,记为 。
现在有两种舞 :
- Salasa 舞。所有人走向其对应的位置,位于位置 的人走向第 个位置当且仅当 的三进制表示, 对应 , 对应 。比如, 可以走向 ,当然 也走向 。
- Rumba 舞。所有人走向其所在位置编号加 的位置。如果等于 ,去 。
现在给你一个 序列表示以上两种舞。请问最后每个人站在哪里?
分析
从低位到高位建 ,维护 表示位置为根结点到结点 的路径所表示的三进制数的是第几个人。
处理 也就是实现交换 和 ,需要实现懒标记进行延迟交换。
处理 也就是全局加一,三进制就是让 。
时间复杂度
代码
#include <iostream>
#include <string>
using namespace std;
const int N = 800011;
string T;
int rt, n, len, tot, three[21], trie[N][3], w[N], lazy[N], ans[N];
void build(int &rt, int dep, int now) {// 建 Trie
if (!rt)
rt = ++tot;
if (dep == n) {
w[rt] = now;
return;
}
for (int i = 0; i < 3; ++i)
build(trie[rt][i], dep + 1, now + i * three[dep]);
}
void plusone(int rt) {// 全局加一
if (!trie[rt][0])
return;
if (lazy[rt]) {// 延迟标记
for (int i = 0; i < 3; ++i)
lazy[trie[rt][i]] ^= 1;
swap(trie[rt][1], trie[rt][2]);
lazy[rt] = 0;
}
int t = trie[rt][0];
trie[rt][0] = trie[rt][2];
trie[rt][2] = trie[rt][1];
trie[rt][1] = t;
plusone(trie[rt][0]);
}
void dfs(int rt, int dep, int now) {
if (dep == n) {
ans[w[rt]] = now;
return;
}
if (lazy[rt]) {
for (int i = 0; i < 3; ++i)
lazy[trie[rt][i]] ^= 1;
swap(trie[rt][1], trie[rt][2]);
lazy[rt] = 0;
}
for (int i = 0; i < 3; ++i)
dfs(trie[rt][i], dep + 1, now + i * three[dep]);
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> T, len = T.length();
three[0] = 1;
for (int i = 1; i <= n; ++i)
three[i] = three[i - 1] * 3;
build(rt, 0, 0);
for (int i = 0; i < len; ++i)
if (T[i] == 'S')
lazy[rt] ^= 1;
else
plusone(rt);
dfs(rt, 0, 0);
for (int i = 0; i < three[n]; ++i)
cout << ans[i] << ' ';
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2020-02-09 #网络流,树状数组#JZOJ 4020 Revolution with JZOJ 4018 Magic
2020-02-09 #高精度,排列组合、dp#JZOJ 2755 树的计数
2020-02-09 #三分,分治,计算几何,prim#JZOJ 3860 地壳运动
2020-02-09 #dp、树状数组#JZOJ 3859 孤独一生
2020-02-09 #搜索,计算几何#JZOJ 4016 圈地为王
2020-02-09 #费马小定理#JZOJ 4015 数列