火星人

题目链接:luogu P4036 / ybt金牌导航4-5-3

题目大意

给你一个字符串,要你维护三个东西。
修改字符串的一个字符,往字符串的一个地方插入一个字符,询问两个后缀的最长公共前缀。

思路

如果没有修改和插入,我们容易想到 SA。
但是它问题是它会修改。

那我们想到 SA 就搞不了,我们考虑垃圾一点的算法,二分+哈希。
哈希的话你就需要维护快速求一段区间的哈希值。
那区间求值,还有插入,自然想到平衡树。
由于它这个看起来比较玄学?我们用替罪羊。(不过好像用 Treap Splay 什么的也可以)

然后关于哈希的计算大概就是 hsnow=hslsnow×diszrsnow+1+valnow×diszrsnow+hsrsnowhs_{now}=hs_{ls_{now}}\times di^{sz_{rs_{now}}+1}+val_{now}\times di^{sz_{rs_{now}}}+hs_{rs_{now}}hsnow​=hslsnow​​×diszrsnow​​+1+valnow​×diszrsnow​​+hsrsnow​​
dixdi^xdix 我们预处理,就是哈希的底数。

然后别的正常搞搞就是了。
(记得 up)

代码

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#define dii 131
#define alph (0.75)
#define logalph (log(4.0) - log(3.0))
#define ull unsigned long longusing namespace std;ull di[150001];
int m, n, a[300001], x, y, maxdeg, tmp;
char c[300001], op;int sta[3000001], root;
int ls[3000001], rs[3000001], sz[3000001];
ull hs[3000001], val[3000001];int newpoint() {int re = sta[sta[0]--];ls[re] = rs[re] = 0;sz[re] = 0;val[re] = 0;return re;
}void up(int now) {sz[now] = sz[ls[now]] + sz[rs[now]] + 1;hs[now] = hs[ls[now]] * di[sz[rs[now]] + 1] + val[now] * di[sz[rs[now]]] + hs[rs[now]];
}int build(int l, int r) {if (l > r) return 0;int now = newpoint();val[now] = a[(l + r) >> 1];sz[now] = 1;if (l != r) {int mid = (l + r) >> 1;ls[now] = build(l, mid - 1);rs[now] = build(mid + 1, r);}up(now);return now;
}ull Query(int now, int l, int r, int L, int R) {if (L == l && r == R) {return hs[now];}int mid = sz[ls[now]];//都在左边或都在右边if (R < l + mid) return Query(ls[now], l, l + mid - 1, L, R);if (L > l + mid) return Query(rs[now], l + mid + 1, r, L, R);ull re = 0;//分成三部分,左边的,这个位置的,右边的if (L < l + mid) re = Query(ls[now], l, l + mid - 1, L, l + mid - 1);if (L <= l + mid && l + mid <= R) re = re * di[1] + val[now];if (l + mid < R) re = re * di[R - (l + mid)] + Query(rs[now], l + mid + 1, r, l + mid + 1, R);return re;
}void make_bian(int now) {//拍扁if (ls[now]) make_bian(ls[now]);sta[++sta[0]] = now;a[++tmp] = val[now];if (rs[now]) make_bian(rs[now]);
}void change_(int now, int l, int r, int pl, int num) {int mid = sz[ls[now]];if (pl <= l + mid - 1) change_(ls[now], l, l + mid - 1, pl, num);else if (pl == l + mid) val[now] = num;else change_(rs[now], l + mid + 1, r, pl, num);up(now);
}bool insert_(int &now, int pl, int num, int deg) {if (!now) {now = newpoint();sz[now] = 1;val[now] = hs[now] = num;return deg <= maxdeg;}bool ck;int mid = sz[ls[now]];if (pl <= sz[ls[now]]) ck = insert_(ls[now], pl, num, deg + 1);else ck = insert_(rs[now], pl - sz[ls[now]] - 1, num, deg + 1);up(now);if (ck && (alph * sz[now] + 6 < sz[ls[now]] || alph * sz[now] + 6 < sz[rs[now]])) {tmp = 0;make_bian(now);now = build(1, sz[now]);return 0;}return ck;
}int main() {di[0] = 1;for (int i = 1; i <= 150000; i++)di[i] = di[i - 1] * dii;for (int i = 1; i < 3000000; i++)sta[++sta[0]] = 3000000 - i;scanf("%s", c + 1);n = strlen(c + 1);for (int i = 1; i <= n; i++) {a[i] = c[i] - 'a' + 1;}root = build(1, n);scanf("%d", &m);while (m--) {op = getchar();while (op != 'Q' && op != 'R' && op != 'I') op = getchar();if (op == 'Q') {scanf("%d %d", &x, &y);int l = 0, r = min(n - x + 1, n - y + 1), ans = 0;while (l <= r) {//二分int mid = (l + r) >> 1;if (Query(root, 1, n, x, x + mid - 1) == Query(root, 1, n, y, y + mid - 1)) {ans = mid;l = mid + 1;}else r = mid - 1;}printf("%d\n", ans);continue;}if (op == 'R') {scanf("%d", &x);c[1] = getchar();while (c[1] < 'a' || c[1] > 'z') c[1] = getchar();y = c[1] - 'a' + 1;change_(root, 1, n, x, y);continue;}if (op == 'I') {scanf("%d", &x);c[1] = getchar();while (c[1] < 'a' || c[1] > 'z') c[1] = getchar();y = c[1] - 'a' + 1;n++;maxdeg = log(1.0 * n) / logalph;insert_(root, x, y, 0);continue;}}return 0;
}

【luogu P4036】【ybt金牌导航4-5-3】火星人相关推荐

  1. 【ybt金牌导航2-3-3】【luogu P3975】K小子串 / 弦论

    K小子串 / 弦论 题目链接:ybt金牌导航2-3-3 / luogu P3975 题目大意 给你一个字符串,要你求字典序第 k 小的子串. (相同的子串可能算一个,也可能算多个,数据以读入 0/1 ...

  2. 【ybt金牌导航8-3-3】【luogu P4593】分数计算 / 教科书般的亵渎(数学)(拉格朗日插值)

    分数计算 / 教科书般的亵渎 题目链接:ybt金牌导航8-3-3 / luogu P4593 题目大意 有一些怪,血量从 1~n,其中有 m 个数是没有怪的,给出这些数. 然后你可以每次操作攻击所有怪 ...

  3. 【ybt金牌导航4-7-3】【luogu P3437】三维俄罗斯方块/TET-Tetris 3D

    三维俄罗斯方块/TET-Tetris 3D 题目链接:ybt金牌导航4-7-3 / luogu P3437 题目大意 要你支持区间求最大,并把这个区间的所有点高度改为你求得的最大值加一个值. 最后要你 ...

  4. 【ybt金牌导航3-6-3】【luogu P3007】奶牛议会 / The Continental Cowngress G(两种方法)

    奶牛议会 / The Continental Cowngress G 题目链接:ybt金牌导航3-6-3 / luogu P3007 题目大意 有一些人,每个人对众多决案中的两个决案有表示好或不好. ...

  5. 【ybt金牌导航3-2-1】【luogu P3376】网络最大流【Dinic算法】

    网 络 最 大 流 网络最大流 网络最大流 题目链接:ybt金牌导航3-2-1 / luogu P3376 题目 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入 第一行包含四个正整数 ...

  6. 【ybt金牌导航8-7-1】数对统计 / 关于莫比乌斯函数的少量内容

    数对统计 题目链接:ybt金牌导航8-7-1 题目大意 给你 n,m,求 gcd(x,y)=1 的数对个数. 1<=x<=n,1<=y<=m 思路 莫比乌斯函数 什么东西 首先 ...

  7. 【DP】【树状数组】方伯伯的玉米田/优美玉米(luogu 3287/金牌导航 数据结构优化DP-5)

    正题 luogu 3287 金牌导航 数据结构优化DP-5 题目大意 有n个玉米,给出高度,你可以选择一个区间,使这个区间的玉米高度+1,你可以进行k次这样的操作,查询你操作完后最长不下降子序列最大值 ...

  8. 【DP】【树状数组】免费馅饼(luogu 7302/金牌导航 数据结构优化DP-4)

    正题 luogu 7302 金牌导航 数据结构优化DP-4 题目大意 在坐标轴上会出现n个金币,第i个金币tit_iti​时在wiw_iwi​出现(只出现一个单位时间),价值为sis_isi​,当你t ...

  9. 【DP】【线段树】基站选址(luogu 2605/金牌导航 数据结构优化DP-2)

    正题 luogu 2605 金牌导航 数据结构优化DP-2 题目大意 有若干个村庄在一条直线上,距离第一个村庄did_idi​,在该村庄建立基站要花费cic_ici​,如果在离该村不大于sis_isi ...

最新文章

  1. [MaxCompute MapReduce实践]通过简单瘦身,解决Dataworks 10M文件限制问题
  2. 趣谈 23 种设计模式(多图 + 代码)
  3. Java8之lambda表达式的总结
  4. 同学,你有一份来自支付宝AI学姐的面试锦囊待查收
  5. AngularJs angular.bind、angular.bootstrap、angular.copy
  6. exosip 和 pjsip 简介
  7. 【扫描线】【POJ-1177】Picture【周长并】
  8. 查询字符串中子字符串所有出现位置
  9. 【Python教你一招】用Python实现黑客帝国代码雨效果(3种方式)
  10. Mysql数据库自动备份
  11. chromium之WebUI
  12. python关于q检验
  13. iOS开发:使用大图+脚本,生成各种size的app icon和图片素材
  14. 测试还是国外的香?走进海外测试开发工程师
  15. 【干货】洋葱淘elya妞:电商小白产品操盘心得,洋葱淘如何搞到种子用户
  16. 3D人脸查看器和匹配器
  17. python中,ttk.Combobox的background、foreground和font属性的设置问题
  18. java datetime转int_java日期int和String互转
  19. 联手中信银行 物品互赠平台宣布“不卖只送”
  20. 解密阿里巴巴加密技术: 爬虫JS逆向实践-1688 【JS混淆加密解析】

热门文章

  1. 为什么出价策略会进入学习期,周期是多久。
  2. CSDN程序员俱乐部里活动热闹,成都、杭州、济南活动盛花绽放~
  3. LilyPond教程(5)——钢琴独奏片段 III
  4. 6.5寸,双卡双待,廉价机,带不来惊喜的苹果,还能撑多久
  5. RTthread的FAL组件介绍
  6. html练习--写信
  7. [Render] 适用于高级Unity创作者的通用渲染管线[4] - URP中的光照
  8. 最新VMware Workstation 9.0 / Player 5.0 / Fusion 5.0/VMware Tools 9.2.0 不同平台正式版下载
  9. 冷门工具【Powershell】学习,一
  10. 天龙手游角色删除服务器还有显示,天龙八部手游怎么删除角色_角色删除方法详解_玩游戏网...