jiangly模板-字符串

news/2025/11/4 22:25:47/文章来源:https://www.cnblogs.com/filt/p/19191549
目录

目录
  • 马拉车(Manacher)
  • Z 函数
  • 后缀数组
    • 后缀自动机(SAM 新版)
  • KMP


马拉车(Manacher)

/**   马拉车(Manacher, with string)*    2024-04-06: https://qoj.ac/submission/380047*    2024-04-09: https://qoj.ac/submission/384389 【模板】
**/
std::vector<int> manacher(std::string s) {std::string t = "#";for (auto c : s) {t += c;t += '#';}int n = t.size();std::vector<int> r(n);for (int i = 0, j = 0; i < n; i++) {if (2 * j - i >= 0 && j + r[j] > i) {r[i] = std::min(r[2 * j - i], j + r[j] - i);}while (i - r[i] >= 0 && i + r[i] < n && t[i - r[i]] == t[i + r[i]]) {r[i] += 1;}if (i + r[i] > j + r[j]) {j = i;}}return r;
}

Z 函数

/**   Z函数*    2023-08-11: https://ac.nowcoder.com/acm/contest/view-submission?submissionId=63378373*    2024-04-09: https://qoj.ac/submission/384405 【模板】
**/
std::vector<int> Z(std::string s) {int n = s.size();std::vector<int> z(n + 1);z[0] = n;for (int i = 1, j = 1; i < n; i++) {z[i] = std::max(0, std::min(j + z[j] - i, z[i - j]));while (i + z[i] < n && s[z[i]] == s[i + z[i]]) {z[i]++;}if (i + z[i] > j + z[j]) {j = i;}}return z;
}

后缀数组

/**   后缀数组(SuffixArray 旧版)*    2023-03-14: https://atcoder.jp/contests/discovery2016-qual/submissions/39727257*    2023-09-05: https://qoj.ac/submission/164483*    2024-04-09: https://qoj.ac/submission/384415 【模板】
**/
struct SuffixArray {int n;std::vector<int> sa, rk, lc;SuffixArray(const std::string &s) {n = s.length();sa.resize(n);lc.resize(n - 1);rk.resize(n);std::iota(sa.begin(), sa.end(), 0);std::sort(sa.begin(), sa.end(), [&](int a, int b) {return s[a] < s[b];});rk[sa[0]] = 0;for (int i = 1; i < n; ++i)rk[sa[i]] = rk[sa[i - 1]] + (s[sa[i]] != s[sa[i - 1]]);int k = 1;std::vector<int> tmp, cnt(n);tmp.reserve(n);while (rk[sa[n - 1]] < n - 1) {tmp.clear();for (int i = 0; i < k; ++i)tmp.push_back(n - k + i);for (auto i : sa)if (i >= k)tmp.push_back(i - k);std::fill(cnt.begin(), cnt.end(), 0);for (int i = 0; i < n; ++i)++cnt[rk[i]];for (int i = 1; i < n; ++i)cnt[i] += cnt[i - 1];for (int i = n - 1; i >= 0; --i)sa[--cnt[rk[tmp[i]]]] = tmp[i];std::swap(rk, tmp);rk[sa[0]] = 0;for (int i = 1; i < n; ++i)rk[sa[i]] = rk[sa[i - 1]] + (tmp[sa[i - 1]] < tmp[sa[i]] || sa[i - 1] + k == n || tmp[sa[i - 1] + k] < tmp[sa[i] + k]);k *= 2;}for (int i = 0, j = 0; i < n; ++i) {if (rk[i] == 0) {j = 0;} else {for (j -= j > 0; i + j < n && sa[rk[i] - 1] + j < n && s[i + j] == s[sa[rk[i] - 1] + j]; )++j;lc[rk[i] - 1] = j;}}}
};

后缀自动机(SAM 新版)

/**   后缀自动机(SAM 新版)*    2023-05-27: https://cf.dianhsu.com/gym/104353/submission/207318083*    2023-09-25: https://qoj.ac/submission/188106*    2024-04-09: https://qoj.ac/submission/384423 【模板】*    2024-04-09: https://qoj.ac/submission/384429 【模板】
**/
struct SAM {static constexpr int ALPHABET_SIZE = 26;struct Node {int len;int link;std::array<int, ALPHABET_SIZE> next;Node() : len{}, link{}, next{} {}};std::vector<Node> t;SAM() {init();}void init() {t.assign(2, Node());t[0].next.fill(1);t[0].len = -1;}int newNode() {t.emplace_back();return t.size() - 1;}int extend(int p, int c) {if (t[p].next[c]) {int q = t[p].next[c];if (t[q].len == t[p].len + 1) {return q;}int r = newNode();t[r].len = t[p].len + 1;t[r].link = t[q].link;t[r].next = t[q].next;t[q].link = r;while (t[p].next[c] == q) {t[p].next[c] = r;p = t[p].link;}return r;}int cur = newNode();t[cur].len = t[p].len + 1;while (!t[p].next[c]) {t[p].next[c] = cur;p = t[p].link;}t[cur].link = extend(p, c);return cur;}int extend(int p, char c, char offset = 'a') {return extend(p, c - offset);}int next(int p, int x) {return t[p].next[x];}int next(int p, char c, char offset = 'a') {return next(p, c - 'a');}int link(int p) {return t[p].link;}int len(int p) {return t[p].len;}int size() {return t.size();}
};

KMP

/**   前缀函数(KMP)*    2023-11-17: https://qoj.ac/submission/253754*    2024-04-09: https://qoj.ac/submission/384408 【模板】
**/
std::vector<int> kmp(std::string s) {int n = s.size();std::vector<int> f(n + 1);for (int i = 1, j = 0; i < n; i++) {while (j && s[i] != s[j]) {j = f[j];}j += (s[i] == s[j]);f[i + 1] = j;}return f;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/956090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 内存模型(JMM)中 volatile 的作用与限制

volatile关键字的主要作用是限制JVM进行指令重排,保证变量对其他线程的可见性,可以避免创建对象才完成了一半就被其他线程引用到这个对象,保证创建完成后才对其他线程可见。static class Value {int x; // 默认 0Va…

今日学习:二分

P3853 天津省选 /* 这个题和P2678几乎一样,但说实话我还没看懂。 1.首先检查的标准我没想到。是要检查当前的空旷指数还是路标数? 2.其次check的逻辑我还是没想明白。 3.犯了个小错。计算mid应该放在while循环里面。…

Ice Breaker Games - 一个在线免费的游戏网站,无需登录,打开即玩。

Ice Breaker Games - 一个在线免费的游戏网站,无需登录,打开即玩。 https://www.icebreakgame.com/

Java获取当前时间的下一天以及30天前的时间

有这样的一个需求。需要得到当前时间的下一天以及30前的时间。在计算30天前的时间时出现了一点问题,时间出错,但是公式没有出错,后来才发现是运算超出了Integer的范围。( 24 * 60 * 60*1000) 这种计算表达式在 Java…

论文导读:从 TSMC ISSCC 看 SRAM 存算发展

上次集中学习存算工作还是一年半以前,时光如梭,SRAM CIM 范式对比记忆又有新花样。本篇 blog 针对 ISSCC 2024 34.4 TSMC 的 3 nm 数字 SRAM 近存算 Macro 个例分析,并结合架构视角谈谈个人感触[1]。 RAM 的物理-逻…

edge chromium浏览器copilot图标消失处理

解决edge浏览器copilot图标消失找到edge浏览器的配置文件Local State %APPDATA%\..\Local\Microsoft\Edge\User Data修改配置variations_country 改成US,记得任务管理器完全关闭edge浏览器后修改

AI - 自然语言处理(NLP) - part 2 - 词向量 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

洛谷 P4577

题面太屎了。给定一棵大小为 \(n\) 的树,每个节点有权值 \(a_i\),问最多能选出多少个节点,使得若 \(v \in subtree_u\),则 \(a_v \ge a_u\) 成立。 \(n \le 2 \times 10^5\)。这个问题丢到序列上就是 \(LIS\) 了,…

C++算法贪心例题讲解 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

AI元人文:理论框架、僵局本质与文明演化的系统性构想

AI元人文:理论框架、僵局本质与文明演化的系统性构想 一、核心命题与理论基石核心命题:从“价值对齐”到“价值权衡”的范式革命传统AI的“价值对齐”范式陷入三重困境:认知科学误区(沿用过时的信息处理模型)、方…

[linux-mint] Surface Pro4 安装linux驱动

Surface Pro4 这个被淘汰下来的机器,一直没想好要如何处理,因为有平板,所以也不想刷Android系统,最终决定还是安装linux,当一个办公小平板来使用,顺便练练linux环境软件使用,所以就选择系统,然后发现好多linux…

[B] AGC VP 记录

AtCoder Grand Contest 049 AT_agc049_e [AGC049E] Increment Decrement AtCoder Grand Contest 052 约 1h 切 A,之后都不会了。 A - Long Common Subsequence 先从左到右放 \(n\) 个 \(0\),\(n\) 个 \(1\)。发现 \(…

2025年河南工业大学2025新生周赛(2)

A 小唐的签到 小唐到达教室的时间等于路上所用时间和上楼时间之和,注意如果教室在n楼,只需要上n-1层。#include<bits/stdc++.h> using namespace std; int main() {int a, x, n, b, y;cin >> a >> …

Atcoder [ARC161C] Dyed by Majority (Odd Tree) 题解 [ 绿 ] [ 树的遍历 ] [ 构造 ] [ 贪心 ]

Dyed by Majority (Odd Tree) 想起来无聊,写起来恶心。 首先手模一下,发现叶子节点可以确定它父亲的颜色。这启示我们自底向上确定颜色。 因此考虑在已确定所有儿子的颜色时,确定自己的颜色,此时有两种情况:儿子中…

Reflections on Trusting Trust by Ken Thompson

来源:https://aeb.win.tue.nl/linux/hh/thompson/trust.htmlKen Thompsons "cc hack" - Presented in the journal, Communication of the ACM, Vol. 27, No. 8, August 1984, in a paper entitled "R…

[Agent] ACE(Agentic Context Engineering)源码阅读笔记---(1)基础模块

[Agent] ACE(Agentic Context Engineering)源码阅读笔记---(1)基础模块 目录[Agent] ACE(Agentic Context Engineering)源码阅读笔记---(1)基础模块0x00 概要0x01 示例1.1 建立简单Agent1.2 后续操作Load and …

AI大语言模型从0开发

Transformer Tokenization 考虑到计算机没有办法直接识别人类语言,我们将每一个词映射为一个token使得计算机可以直接识别。 为实现这个目的我们使用BPE算法将每个词划分为若干个前缀和后缀,以此拼起来一个词,节省v…

第三十三篇

今天是11月4号,钳工实训真难。累死了。

2025.11.4

今天学习了二叉树的树和森林的转换