[回文自动机][阈值] BZOJ 4932: 基因

【数据结构】自动机全家桶(AC、回文、后缀自动机) AC自动机、回文自动机、后缀自动机 阅读详情

Solution

  • 关于回文自动机的前端插入:一个回文串的回文前缀显然是其回文后缀。实现两端插入需要记录两个指针lastback,lastfront,注意当最长回文前(后)缀为原串时,两个指针就相同了。
  • 一个串的子串的回文自动机是这个串的回文自动机的子图。因为增量法构造回文自动机时是不会改变原有的自动机的。

这道题的话阈值B=n√,每B个点建一个到最右端的回文自动机。
查询从每个关键点向右前端插入字符,并判断新增的回文串与右端点的关系。
这样的做法应该不能用基于势能分析的插入方法了吧。。。
感觉对quick数组可持久化常数会比较大???

#include <bits/stdc++.h>
using namespace std;

const int N = 101010;
const int M = 350;

inline char get(void) {
    static char buf[100000], *S = buf, *T = buf;
    if (S == T) {
        T = (S = buf) + fread(buf, 1, 100000, stdin);
        if (S == T) return EOF;
    }
    return *S++;
}
template<typename T>
inline void read(T &x) {
    static char c; x = 0; int sgn = 0;
    for (c = get(); c < '0' || c > '9'; c = get()) if (c == '-') sgn = 1;
    for (; c >= '0' && c <= '9'; c = get()) x = x * 10 + c - '0';
    if (sgn) x = -x;
}
inline void read(char *s) {
    static char c; int len = 0;
    for (c = get(); c < 'a' || c > 'z'; c = get());
    for (; c >= 'a' && c <= 'z'; c = get()) s[len++] = c;
    s[len] = 0;
}

char s[N];
int last1, last2, Tcnt;
int par[N], len[N], ri[N];
int ch[N][30], qui[N][30];
int pf[M][N], ans[M][N], pt[M][N];
int pre[N];
int type, lans, clc;
int n, q, l, r, B;
int bel[N];

inline void ExtendFront(int pos, int r) {
    int p = last2, key = s[pos];
    if (s[pos + len[p] + 1] != key || pos + len[p] + 1 > r) p = qui[p][key];
    if (!ch[p][key]) {
        int np = ++Tcnt, q = par[p];
        len[np] = len[p] + 2;
        if (s[pos + len[q] + 1] == key) par[np] = ch[q][key];
        else ch[qui[q][key]][key];
        memcpy(qui[np], qui[par[np]], sizeof qui[np]);
        qui[np][s[pos + len[par[np]]]] = par[np];
        ch[p][key] = np;
    }
    last2 = ch[p][key];
    if (len[last2] == r - pos + 1) last1 = last2;
}
inline void ExtendBack(int l, int pos) {
    int p = last1, key = s[pos];
    if (s[pos - len[p] - 1] != key || pos - len[p] - 1 < l) p = qui[p][key];
    if (!ch[p][key]) {
        int np = ++Tcnt, q = par[p];
        len[np] = len[p] + 2;
        if (s[pos - len[q] - 1] == key) par[np] = ch[q][key];
        else par[np] = ch[qui[q][key]][key];
        memcpy(qui[np], qui[par[np]], sizeof qui[np]);
        qui[np][s[pos - len[par[np]]]] = par[np];
        ch[p][key] = np;
    }
    last1 = ch[p][key];
    if (len[last1] == pos - l + 1) last2 = last1;
}

int main(void) {
    freopen("1.in", "r", stdin);
    freopen("1.out", "w", stdout);
    read(type); read(n); read(q);
    read(s + 1); s[0] = -1;
    for (int i = 1; i <= n; i++) s[i] -= 'a';
    B = sqrt(n);
    for (int i = 1; i <= n; i++) bel[i] = (i - 1) / B + 1;

    memset(pt, 0x3f, sizeof pt);
    par[0] = par[1] = 1; len[1] = -1; Tcnt = 1;
    for (int i = 0; i < 26; i++) qui[0][i] = qui[1][i] = 1;

    for (int i = 0; i < bel[n]; i++) {
        ++clc; last1 = last2 = 0;
        int st = i * B + 1;
        for (int j = st; j <= n; j++) {
            ExtendBack(st, j);
            pf[i][j] = last2; ans[i][j] = ans[i][j - 1];
            if (pre[last1] != clc) {
                ++ans[i][j]; pre[last1] = clc;
                pt[i][last1] = j;
            }
        }
    }

    while (q--) {
        read(l); read(r); ++clc;
        l ^= type * lans;
        r ^= type * lans;
        if (l > r) swap(l, r);
        if (bel[l] == bel[r]) {
            last1 = last2 = 0; lans = 0;
            for (int i = r; i >= l; i--) {
                ExtendFront(i, r);
                if (pre[last2] != clc) {
                    ++lans; pre[last2] = clc;
                }
            }
        } else {
            lans = ans[bel[l]][r];
            last2 = pf[bel[l]][r];
            for (int i = bel[l] * B; i >= l; i--) {
                ExtendFront(i, r);
                if (pre[last2] != clc) {
                    pre[last2] = clc;
                    if (pt[bel[l]][last2] > r) ++lans;
                }
            }
        }
        printf("%d\n", lans);
    }
    return 0;
}
【华为OD机试真题】18、喊7的次数重排 | 机试真题+思路参考+代码解析(C++、Java、Py) 题目描述 >喊7是一个传统的聚会游戏,N个人围成一圈,按顺时针从1到N编号。   编号为1的人从1开始喊数,下一个人喊的数字为上一个人的数字加1,但是当将要喊出来的数字是7的倍数或者数字本身含有7的话,不能把这个数字直接喊出来,而是要喊”过”。   假定玩这个游戏的N个人都没有失误地在正确的时机喊了”过”,当喊到数字K时,可以统计每个人喊”过”的次数。   现给定一个长度为N的数组,存储了打乱顺序的每个人喊”过”的次数,请把它还原成正确的顺序,即数组的第i个元素存储编号i的人喊 阅读详情

相关推荐

低功耗模式下的看门狗使用

最近用国产芯片AT32在做一个低功耗的项目,为了实现低功耗模式下的定时唤醒,我选择的是使用相对比较简单的看门狗来做,下面就分享一下使用过程~ 为了最大限度的降低功耗,我用的是待机模式,先看看几种低功耗模式以及唤醒的区别: 而看门狗AT32提供了两种,分别是独立看门狗(IWDG)和窗口看门狗(WWDG),其区别大概有以下几点: 1、独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效;窗口看门狗由从 APB1 时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常

dc18883988396的博客 3028

回文树

基础插入算法 增量构造法 假设已经构造出\(s\)的回文树,现在在末尾加一个\(c\),维护\(sc\)的回文树。 定理:以新加入的字符\(c\)为结尾的,未在\(s\)中出现过的回文子串最多只有一个,且为\(sc\)的最长回文后缀。 证明:对于两个\(sc\)的回文后缀\(p\)和\(q\),不妨设\(|p|<|q|\)。 那么\(p\)一定是\(q\)的回文前缀,显然在\(...

140

宽带波束形成

介绍了宽带波束形成器的时域滤波结构,以及波束响应的计算公式,宽带波束形成器的波束响应可表示为权重向量和方向向量的积

... 2489

挖坑,要写的题目

bzoj4932— 区间不同回文串种类数(强制在线) 洛谷p6172 bzoj3195—状压dp

V4yne.的博客 294

hcaptcha无感验证码逆向实战:从接口分析到环境补全

本文详细解析了hcaptcha无感验证码的逆向实战过程。通过分析核心接口与加密逻辑,重点介绍了采用环境补全策略来模拟真实浏览器环境,从而绕过验证码检测。文章提供了从接口抓包、剖析hsw.js加密核心到使用Node.js搭建模拟环境的完整步骤,为自动化操作提供了一种稳健的解决方案。

weixin_29324401的博客 1150

20.Labview使用子vi进行VI间的数据传递详解(模块化)

子VI(模块化)题主在题注中也提到, 子VI的建立只是为了减少程序的负担,那么我们当使用子VI的时候首先就要明确什么是子VI?什么样的程序可以作为子VI?首先我们来看NI官方给的定义,具体说明如下图所示:题主已经将重点画出来了,在官方的解释中将子VI定义为了模块化,大家可以看到创建模块化子VI的特点在于减少代码重复工作优化了程序的框架结构。把一个代码打包,需要的时候就拎出来让他处理处理,不需要的时候就让它躺在我的列表里就行了也不占用运行空间。那么创建子VI需要需要注意以下几点:①任何一个程序。

关注我,更多技术问题欢迎私聊~ 3515

回文自动机(PAM)

回文自动机,也称回文树,是用来解决一些manacher算法不容易解决的回文串的问题,比如求解字符串s中以第i个字符结尾的回文串的个数。当然它还可以用于求解本质不同的回文子串的数目,所有的回文子串的数目,其复杂度也都是O(n)的,其中n是字符串的长度。

AC__dream的博客 2059

在实车上进行lio-sam测试

PS:将雷达和imu相对固定后,拆下来,原地晃啊晃,直到xyz进度达到百分百,参考gif。标定完成后,会在result文件夹下生成result.txt。

如果想成为中心,那么就到中心去吧。 997

回文自动机(PAM) 详解

PAM 是一种高效存储字符串中所有回文子串的自动机,用于解决回文串相关问题。 虽然代码稍微长一点,但写起来比 manacher 容易很多,毕竟没有加了一堆字符再转回原串的若干上取整下取整问题。 前置知识 无。或许需要一些自动机相关的理论基础。 结构 & 定义 状态 我们用 PAM 上的一个节点来表示一个回文子串,作为 PAM 的一个状态。但回文串分奇偶两种,像 manacher 一样在每...

如果 Markdown 炸了请前往 https://www.cnblogs.com/ying-xue 查看文章QAQ 887

英飞凌TC3xx--深度手撕HSM安全启动(三)--TC3xx HSM系统架构

TC3xx的HSM内核是一颗32位的ARM Cortex M3,主频可达100MHz,支持对称算法AES128、非对称算法PKC(Public Key Crypto) ECC256、Hash SHA2,以及TRNG(真随机数生成)。

认真搞搞汽车MCU 5738

【WRFDA教程第一期】运行观测预处理程序(OBSPROC)

运行观测预处理程序(OBSPROC)

WW、forever的博客 1891

回文自动机(PAM)入门路线 + P3649 【模板】[APIO2014] 回文串(PAM)

PAM 回文自动机 回文树

Jacob0824的博客 1323

YOLOv13涨点改进 | 全网独家创新、高效涨点改进篇 | CVPR 2024 | YOLOv13引入SHSA单头自注意力模块,减少冗余的多头注意力,轻量化改进,助力目标检测和图像分类任务高效涨点

本文提出了一种改进YOLOv13模型的新方法——SHSA(单头自注意力)模块,用于提升目标检测任务的计算效率和推理速度。SHSA通过简化多头注意力机制为单头结构,显著减少了计算冗余和内存占用。实验表明,该模块在保持精度的同时,在GPU、CPU和移动设备上分别实现了3.3倍、8.1倍和2.4倍的加速效果。文章详细介绍了SHSA的结构原理、核心代码实现方法,以及如何集成到YOLOv13的配置文件中。这种改进特别适合资源受限设备,为实时目标检测提供了更优的速度-精度平衡方案。

Ai缝合怪、助力小伙伴高效发论文 506

回文自动机 PAM

回文自动机是一个用来维护一个字符串的回文子串的工具可以应用于求本质不同回文子串个数,回文子串出现次数,最小回文划分等问题。

Evan_song1234的博客 514

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

bzoj4044: [Cerc2014] Virus synthesis 回文自动机

bzoj4044: [Cerc2014] Virus synthesis Description Viruses are usually bad for your health. How about fighting them with… other viruses? In this problem, you need to find out how to synthesize suc...

maxtir的博客 502

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

PAM / 回文自动机(回文树)略解

回文自动机可以处理一个字符串的回文子串的信息,复杂度为 O(n)。

破壁人五号的博客 639

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

BZOJ4480:快乐的jyy(回文自动机)

题面 题意:给出两个串,问所有回文串在两个串出现次数之积之和。 应该是回文自动机果题 插完一个串后重置last,再插入另一个串 每个状态对于两个串分别统计Right集的大小 就可以统计答案了 #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;algorithm&gt; #include &lt;cmath&g...

KKiseki的博客 3747

【BZOJ】4044: [Cerc2014] Virus synthesis-回文自动机

回文自动机DP,记录父结点信息转移

远行客 343

回文自动机+CodeTON Round 2 C,D

数据结构+算法=代码

R的博客 848

BZOJ 4128

矩阵BSGS,同样处理即可。 有一个优化可以更快,判断矩阵相等可以$O(n)$。列矩阵的使用。 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=71; int n,m,P; struct matrix{ int a[N][N]; int t; matr...

weixin_34179968的博客 154

回文自动机(最基础版)

搞了一天多的回文自动机,总算勉强明白了一些,先记录一下最简单的。

qiaodxs的博客 235

回文自动机

回文自动机一,定义二,状态概述三,引理四,具体理论例题1,P3649 [APIO2014] 回文串 特别鸣谢:翁文涛 – 2017 国家候选队论文《回文树及其应用 》 特别鸣谢:bzt的题解 一,定义 PAM 是一个接受且仅接受某个字符串的所有回文子串的中心及右半部分的 DFA。 保证回文串为奇回文串,如果不是需要构造,如此PAM就是一颗自动机而非分裂的子树 这是一颗成品 PAM ~ 看起来不那么离散嘛 二,状态概述 PAM 的每个状态都表示一个回文子串,其中包含两个特殊状态, 长度 为 0 和

qq_42852687的博客 1986

C++ 回文自动机(PAM):原理、实现与应用全解析

回文自动机(Palindrome Automaton, PAM,也叫回文树)是专门处理**字符串回文子串问题**的高效数据结构,由 Mikhail Rubinchik 在 2015 年提出。它能在 \(O(n)\) 时间复杂度内构建,支持统计回文子串数量、查找最长回文子串、统计各长度回文子串出现次数等核心问题,是处理回文问题的“专属利器”。本文将从核心原理、节点设计、构建流程到实战应用,全面解析回文自动机的设计思想与 C++ 实现技巧。

互联网改遍了世界。 1195

回文自动机:从入门到只会打板

写在前面 如果你会SAMSAMSAM,相信回文自动机不会难懂。 如果你不会,你可以参考我的上一篇文章。 至少回文自动机是治愈系的吧。 作用 回文自动机,也叫回文树,简称PAMPAMPAM实际上它既不是自动机也不是树 处理回文串的有力工具。可完全代替ManacherManacherManacher,就是会多个字符集。 算法流程 首先一个结论:往一个串末尾加入一个字符,最多会增加一个没出现过的回文串。...

Lstdo的博客 387

回文利器——回文自动机

前(che)言(dan) 回文树,也叫回文自动机,是2014年被西伯利亚民族发明的(找不到百度百科,从一篇博客里蒯过来的) 作为解决回文问题的大杀器,回文自动机功能强大,实现技巧充满智慧。——dalao 一个性质 一个长度为N的字符串最多有N个不同的回文子串。 为什么? 我们考虑加入一个字符能产生多少新的回文子串。 现在加入红圈位置的字符,假设绿框框起的都是回文串。然后我们发现一...

Aaronliu17008的博客 1102

LOJ6070 基因 分块+回文自动机

这个在翁文涛的论文里有讲到 大概的就是一个子串的回文自动机是原串回文自动机的子图 于是每隔\(\sqrt n\)重新跑一个\((k \times \sqrt n,n)\)的回文自动机 记录回文串个数和位置 并且分别维护后缀的\(fail\)和前缀的\(fail\) 每次询问\((l,r)\)只需要把\((k \times\sqrt n,r)\)的答案直接加上 再暴力添加\((l,(k \times...

weixin_34256074的博客 255
上一篇: [回文自动机] BZOJ 3676: [Apio2014]回文串
下一篇: [回文自动机][树形DP] CodeChef PALPROB
Vectorxj
博客等级 码龄11年 35粉丝 231原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值