辽宁省实验OJ 235. Sting(manacher+trie)

news2024/11/15 21:50:07

题目

登录 - Lnsyzx Online Judge

思路来源

辽宁省实验oj官方题解

题解

manacher,对回文这一半的串建个trie树,

manacher初始对半径取min的时候,先倍增当前回文串定位到树上这个深度的位置

然后不断往外扩展时在trie树上扩展,

扩展到不能扩展时,在trie树的叶子上打个异或标记,代表到根的这一条链都需要异或这个标记

由于长串肯定比短串后建,最后倒序往上合并异或标记即可

trie可以被哈希替换,即先预处理串的哈希值,然后对回文串的哈希值建一个树的结构,

仍然对叶子结点打标记,只是由于哈希常数比较大,比较难卡过,只能手写哈希才可以

这题回文树不太能做的原因在于,回文树统计的是以r为结尾的回文串,

回跳时fail跳到最长的回文串上,但是这题异或的贡献在于(l+r)/2,

也就是l在回跳时是会发生改变的,导致信息无法复用

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;

char t[N], s[N << 1], vis[N];
int d[N << 1], fa[N][20], node[N << 1], nex[N][26], cnt = 1, xorsum[N];
// 1 : empty string    0 : -1 srtring
inline int nextnode(int x, char c) {
    if(nex[x][c - 'a']) return nex[x][c - 'a'];
    else {
        nex[x][c - 'a'] = ++cnt; fa[cnt][0] = x;
        for(int i = 1; i < 20; i++) 
            fa[cnt][i] = fa[fa[cnt][i - 1]][i - 1];
        return cnt;
    }
}
inline int getnode(char c) {
    if(c == '*') return 1;
    else return nextnode(0, c);
}
inline int getnode(int mid, int di) {
    // cout << "getnode " << mid << ' ' << d[mid] << ' ' << di << endl;
    if(d[mid] == di) return node[mid];
    int ret = node[mid];
    for(int i = 19, t = (d[mid] - di) / 2; i >= 0; i--)
        if(t & (1 << i)) ret = fa[ret][i];
    return ret;
}

void outnode(int x) {
    printf("%d   fa = %d   xor = %d    ", x, fa[x][0], xorsum[x]);
    for(int i = 0; i < 26 ; i++) {
        if(nex[x][i]) printf("%c,%d  ", i + 'a' , nex[x][i]);

    }
    cout << endl;
}

int main() {
    int T; cin >> T;
    while(T--) {
        int n = 0; scanf("%s", t);
        s[0] = '~', s[1] = '*';
        for(int i = 0; t[i]; i++, n++) {
            s[2 + (i << 1)] = t[i];
            s[3 + (i << 1)] = '*';
        }
        n = n * 2 + 2; s[n] = 0;
        for(int i = 0; i < 20; i++) fa[1][i] = 1;
        for(int i = 1, mid = 0, R = 0, now, td; i < n - 1; i++) {
		    if(i > R) td = 1, now = getnode(s[i]);
		    else td = min(d[mid * 2 - i], R - i + 1), now = getnode(mid * 2 - i, td);
            // cout << endl << i << ' ' << now << ' ' << td << ' ' << d[mid * 2 - i] << endl;
		    while(s[i - td] == s[i + td]) {
                if(s[i - td] != '*') now = nextnode(now, s[i - td]);
                td++;
            }
            // cout << i << ' ' << now << endl;
		    if(i + td > R) mid = i, R = i + td - 1;
            d[i] = td; node[i] = now; 
            if(now > 1) {
                xorsum[now] ^= ((i - 2) >> 1);
                // printf("xorsum[%d] ^= %d\n\n", now, (i - 2) / 2);
            }
	    }
        
        int ans = 0;
        for(int f = cnt; f >= 1; f--){
            xorsum[fa[f][0]] ^= xorsum[f];
            ans=max(ans,xorsum[f]);
        }
        cout << ans << '\n';
        
        if(T) {
            memset(nex, 0, sizeof(nex));
            memset(fa, 0, sizeof(fa));
            memset(xorsum, 0, sizeof(xorsum));
            cnt = 1, vis[0] = vis[1] = 0;
        }
    }
    return 0;
}

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

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

相关文章

电脑太卡怎么办?这些技巧你必须知道

电脑卡顿是许多电脑用户都会遇到的问题&#xff0c;它可能导致工作效率低下&#xff0c;甚至影响到日常生活。可是电脑太卡怎么办呢&#xff1f;其实电脑卡顿问题通常是可以解决的&#xff0c;只要我们采取正确的方法。本文将介绍三种解决电脑卡顿问题的方法&#xff0c;帮助您…

Excel分类汇总,5个做法,提高数据处理效率!

在日常的工作中&#xff0c;我们经常需要使用Excel中的各种功能&#xff0c;Excel分类汇总功能无疑是数据分析和报告制作中的一把利器&#xff0c;它极大地提高了数据处理的效率和准确性。在现代商业环境中&#xff0c;数据无处不在&#xff0c;而如何从这些数据中提取有效信息…

2024年03月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 下列哪个命令,可以将2024转换成’2024’ 呢?( ) A:str(2024) B:int(2024) C:float(2024) D:bool(2024) 答案:A 本题考察的是str() 语句,将数字转换成字符串用到的是str() 语句。 …

html5各行各业官网模板源码下载(2)

文章目录 1.来源2.源码模板2.1 HTML5好看的旅行网站模板源码2.2 HTML5自适应医院叫号大屏模板源码2.3 HTML5好看的高科技登录页面模板源码2.4 HTML5宠物美容服务公司网站模板源码2.5 HTML5创意品牌广告设计公司网站模板源码2.6 HTML5实现室内设计模板源码2.7 HTML5黄金首饰网站…

安装mysql(windows)

一、安装依赖包 问题如下图所示&#xff1a;初始化数据库mysql报错&#xff0c;所以我们要提前安装缺少依赖包官网下载依赖包https://www.microsoft.com/zh-CN/download/details.aspx?id40784 二、安装mysql 1、官网下载mysql包 https://downloads.mysql.com/archives/co…

mysql中InnoDB的表空间--独立表空间

大家好&#xff0c;上篇文章我们在讲mysql数据目录的时候提到了表空间这个名词&#xff0c;它是一个抽象的概念&#xff0c;对于系统表空间来说&#xff0c;对应着文件系统中一个或多个实际文件&#xff1b;对于每个独立表空间来说&#xff0c;对应着文件系统中一个名为表名.ib…

江苏职称申报大揭秘:你所不知道的那些细节

大家好&#xff01;今天我将带大家深入探索江苏职称申报的一些你可能从未关注过的细节。对于在江苏工作的工程类小伙伴们来说&#xff0c;这些信息或许能助你一臂之力&#xff0c;让你在职称申报的道路上更加顺畅。 我们要明确的是&#xff0c;江苏省的工程类职称申报主要有三种…

LeetCode刷题之HOT100之两数相加

2024/5/27 大家早上好呀&#xff0c;昨晚没睡好&#xff0c;四个小时不到&#xff0c;估计是太兴奋了。昨天去长乐十七孔、下沙赶海啦。远看沙滩上的人群就像一根根木桩矗立在浅滩上&#xff0c;走近些&#xff0c;才发现都佝偻着腰&#xff0c;两只手在沙地淘金&#xff08;摸…

Oracle实践|内置函数之聚合函数

&#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端工程师 &#x1f3c6; 近期荣誉&#xff1a;华为云云享专家、阿里云专家博主、腾讯云优秀创作者、ACDU成员 &#x1f525; 三连支持&#xff1a;欢迎 ❤️关注…

如何深入理解、应用及扩展 Twemproxy?no.15

Twemproxy 架构及应用 Twemproxy 是 Twitter 的一个开源架构&#xff0c;它是一个分片资源访问的代理组件。如下图所示&#xff0c;它可以封装资源池的分布及 hash 规则&#xff0c;解决后端部分节点异常后的探测和重连问题&#xff0c;让 client 访问尽可能简单&#xff0c;同…

2024年上半年信息系统项目管理师下午真题及答案(第一批)

试题一 某项目包含ABCDEFGH共8个活动&#xff0c;各活动的历时、活动逻辑关系如下表所示&#xff1a; 单击下面头像图片领取更多软考独家资料

YOLOv10真正实时端到端目标检测(原理介绍+代码详见+结构框图)| YOLOv10如何训练自己的数据集(NEU-DET为案列)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:真正实时端到端目标检测&#xff08;原理介绍代码详见结构框图&#xff09;| YOLOv10如何训练自己的数据集&#xff08;NEU-DET为案列&#xff09; 博主简介 AI小怪兽&#xff0c;YOLO骨灰级玩家&#xff0c;1&#xff0…

[自动驾驶技术]-8 Tesla自动驾驶方案之硬件(AI Day 2022)

特斯拉在AI Day 2022先介绍了AI编译器&#xff0c;后面又介绍了Dojo的硬件软件&#xff0c;软件部分和AI编译器有部分重叠&#xff0c;本文介绍还是延用AI Day的思路&#xff0c;分为三部分&#xff1a;AI编译和推理&#xff0c;Dojo硬件&#xff0c;Dojo软件。 特斯拉车道检测…

[码蹄集新手训练营]MT1016-MT1020

目录 题号MT1016 宽度与对齐MT1017 左右对齐MT1018 输入宽度MT1020 %s格式符 题号 MT1016 宽度与对齐 #include<stdio.h> int main() { printf("%-5d %5d\n%-5d %5d\n%-5d %5d",455,455,-123,-123,987654,987654);return 0; }MT1017 左右对齐 #include<s…

el-switch自动触发更新事件

比如有这样一个列表&#xff0c;允许修改单条数据的状态。希望在更改el-switch状态时能够有个弹框做二次确认&#xff0c;没问题&#xff0c;el-switch已经帮我们想到了&#xff0c;所以它提供了beforeChange&#xff0c;根据beforeChange的结果来决定是否修改状态。一般确认修…

做抖音电商,可以没有货源和经验,但不能没有耐心

我是王路飞。 在抖音做电商这件事&#xff0c;不需要怀疑其可行性。 经过四五年的发展&#xff0c;平台和商家已经证明了抖音电商的前景&#xff0c;它就是我们普通人做抖音最适合的一个渠道。 想在抖音做电商的&#xff0c;再给你们一个经验之谈&#xff0c;你可以没有货源…

QT 掩码 InputMask

字符规则 如IP输入框可以简单设置为 IP->setInputMask("000.000.000.000");就会有80%的相似度 另外设置掩码用 ui.edtIP->setInputMask(“这里面是字符格式”); ★消除已有的掩码用 ui.edtIP->setInputMask(" "); 而不是ui.…

QTextEdit将多个字符作为一个整体,不可单独修改

考虑一个问题&#xff0c;QTextEdit如何实现类似微信和QQ聊天输入框中的“xxx”效果&#xff0c;其内容作为一个整体&#xff0c;以突出颜色显示&#xff0c;并且不可以单独编辑修改&#xff0c;只能整体删除修改。 突出颜色显示有很多方式可以实现&#xff0c;例如 通过setT…

echarts- 热力图, k线图,雷达图

热力图 热力图可以看成是一种矩形的散点图。 热力图的矩形受itemStyle的影响。 通常配合visualmap组件来根据值的大小做颜色的变化。 热力图主要通过颜色去表现数值的大小&#xff0c;必须要配合 visualMap 组件使用。 visualMap:视觉映射组件 let options {tooltip: {},xAx…

【全开源】景区手绘地图导览系统源码(ThinkPHP+FastAdmin)

一款基于ThinkPHPFastAdmin开发多地图手绘地图导览系统(仅支持H5)&#xff0c;景区升4A5A必备系统&#xff0c;高级版支持全景。 ​打造个性化游览新体验 一、引言&#xff1a;景区导览系统的革新 在旅游业蓬勃发展的今天&#xff0c;景区导览系统成为了提升游客体验的关键。…