洛谷试炼日记(manacher和trie树)(解题报告)

【代码超详解】洛谷 P3805 【模板】manacher算法 一、题目描述 二、算法分析说明与代码编写指导 三、AC 代码 #include<cstdio> #include<algorithm> #include<cstring> #pragma warning(disable:4996) using namespace std; template<class _Ty> inline void manac... 阅读详情

manacher

P4555 [国家集训队]最长双回文串

题目链接

思路:最开始只有一个n^2的思路,不用写都知道会T
看了大佬的思路之后恍然大悟
在求以位置i为中心的最大回文串长度时,更新以i + p[i] - 1位置结尾的最大回文串长度ll[i + p[i] - 1](ll[i + p[i] - 1] = max(ll[i + p[i] -1],p[i] - 1)
更新以i - p[i] +1位置开头的最大回文串长度rr[i - p[i] + 1] = max(rr[i - p[i] + 1],p[i] - 1)
由于只是求出了部分位置 在manacher结束之后 我们还需要更新一遍ll数组和rr数组
这时候的更新思路更为巧妙 rr[i] 通过顺序迭代更新
rr[i] = max(rr[i],rr[i - 2] - 2)
ll[i] 通过逆序迭代更新 ll[i] = max(ll[i],ll[i + 2] - 2)
具体实现见代码:
AC代码:

#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;
const int N = 1e5 + 10;
char s[N << 1];
int p[N << 1],ll[N << 1],rr[N << 1];
int ans,cnt;
void read() {
    char c = getchar();
    s[++ cnt] = '~', s[++ cnt] = '|';
    while (c < 'a' || c > 'z') c = getchar();
    while (c >= 'a' && c <= 'z') s[++cnt] = c, s[++cnt] = '|', c = getchar();
    s[++ cnt] = '\0';
}
void manacher(){
    int mid = 0,r = 0;
    for(int i = 1;i <= cnt;i ++){
        if(i < r) p[i] = min(p[mid * 2 - i], r - i);
        while(s[i + p[i]] == s[i - p[i]]) p[i] ++;
        if(i + p[i] > r) r = i + p[i],mid = i;
        ll[i + p[i] - 1] = max(ll[i + p[i] - 1],p[i] - 1);
        rr[i - p[i] + 1] = max(rr[i - p[i] + 1],p[i] - 1);
    }
}
int main(){
    read();
    manacher();
    for(int i = 2;i <= cnt;i += 2) rr[i] = max(rr[i],rr[i - 2] - 2);
    for(int i = cnt;i >= 2;i -= 2) ll[i] = max(ll[i],ll[i + 2] - 2);
    for(int i = 2;i <= cnt;i += 2) if(rr[i] && ll[i]) ans = max(ans,ll[i] + rr[i]);
    printf("%d\n",ans);
    return 0;
}

P1659 [国家集训队]拉拉队排练

题目链接
这是居然会是一道蓝题呢!虽然说我一开始也没做出来
巧妙的用sum累计,从大到小遍历,后面小的数量中自然会有大的数量,妙啊
AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
const int N = 1e6 + 10;
const int mod = 19930726;
typedef long long ll;
int n;ll k;
char s[N << 1];
int p[N << 1];
int cnt;int tot[N];
ll ans = 1;
void read(){
    char c = getchar();
    s[0] = '~',s[cnt = 1] = '|';
    while(c < 'a' || c > 'z') c = getchar();
    while(c >= 'a' && c <= 'z') s[++ cnt] = c,s[++ cnt] = '|',c = getchar();
}
ll qpow(ll a,int b){
    ll ans = 1;
    while(b){
        if(b & 1) ans = ans * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return ans;
}
void manacher(){
    int mid = 0,r = 0;
    for(int i = 1;i <= cnt;i ++){
        if(i < r) p[i] = min(p[mid * 2 - i], r - i);
        while(s[i + p[i]] == s[i - p[i]]) p[i] ++;
        if(i + p[i] > r) r = i + p[i],mid = i;
        if((p[i] - 1) % 2) tot[p[i] - 1] ++;
    }
}
int main(){
    scanf("%d%lld",&n,&k);
    read();
    manacher();
    int sum = 0;
    for(int i = n;i >= 1;i --){
        if(i % 2 == 0) continue;
        sum += tot[i];
        if(k >= sum){
            ans = (ans * qpow(i,sum)) % mod;
            k -= sum;
        }
        else {
            ans = (ans * qpow(i,k)) % mod;
            k -= sum;
            break;
        }
    }
    if(k > 0) ans = -1;
    printf("%lld\n",ans);
    return 0;
}

Trie字典树

P3879 [TJOI2010]阅读理解

题目链接
就是一道Trie树板子题啦
因为数据加强过了所以用bitset避免MLE
AC代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<bitset>
#include<iostream>

using namespace std;
const int N = 1e4 + 10;
const int M = 5e5 + 10;
char s[N];
int ne[M][26],n,cnt = 0;
bitset<1001> vis[M];
void insert(int x){
    scanf("%s",s + 1);
    int u = 0;
    for(int i = 1;s[i];i ++){
        int v = s[i] - 'a';
        if(!ne[u][v]) ne[u][v] = ++cnt;
        u = ne[u][v];
    }
    vis[u][x] = 1;
}

void check(){
    scanf("%s",s + 1);
    int u = 0,flag = 1;
    for(int i = 1;s[i];i ++){
        int v = s[i] - 'a';
        if(!ne[u][v]){
            flag = 0;break;
        }
        u = ne[u][v];
    }
    if(flag){
        for(int i = 1;i <= n;i ++){
            if(vis[u][i]) printf("%d ",i);
        }
    }
    puts("");
}
int main(){
    scanf("%d",&n);
    for(int i = 1;i <= n;i ++){
        int x;scanf("%d",&x);
        for(int j = 0;j < x;j ++) insert(i);
    }
    int m;scanf("%d",&m);
    for(int i = 0;i < m;i ++) check();
    return 0;
}

P2292 [HNOI2004]L语言

题目链接
思路:还是建Trie树
然后用一个f数组标记一下匹配到的最远距离
AC代码:

#include<map>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iostream>

using namespace std;
const int N = 1e6 + 10;
char s[N << 4];
int cnt,ch[1010][26];
int n,m;
bool flag[N];
map<string,bool> m1;
map<string,int> m2;

inline int read(){
    int ans = 0,f1 = 1;
    char c = getchar();
    while(c < '0' || c > '9'){
        if(c == '-') f1 = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9'){
        ans = ans * 10 + c - '0';
        c = getchar();
    }
    return ans * f1;
}

void insert(){
    scanf("%s",s + 1);
    int u = 0;
    for(int i = 1;s[i];i ++){
        int v = s[i] - 'a';
        if(!ch[u][v]) ch[u][v] = ++cnt;
        u = ch[u][v];
    }
    flag[u] = 1;
}
bool f[N << 1];
int query(){
    scanf("%s",s + 1);
    if(m1[s + 1])return m2[s + 1];
    memset(f,false,sizeof(f));
    f[0] = true;int ans;
    int len = strlen(s + 1);
    for(int i = 0;i <= len;i ++){
        if(!f[i]) continue;
        else ans = i;
        for(int j = i + 1,u = 0;s[j];j ++){
            int v = s[j] - 'a';
            u = ch[u][v];
            if(!u) break;
            if(flag[u]) f[j] = true;//更新最远距离
        }
    }
    m1[s + 1] = true;
    m2[s + 1] = ans ;
    return ans;
}

int main(){
    n = read(),m = read();
    for(int i = 0;i < n;i ++) insert();
    for(int i = 0;i < m;i ++) printf("%d\n",query()) ;
    return 0;
}

P2922 [USACO08DEC]Secret Message G

题目链接
这道题的思路真的超级的简单清晰
就是在查询的时候,如果查询串长度比字典树中所有串的长度都大,那就直接返回答案
如果字典树中有长度大于查询串的串,那么就把答案加上经过当前节点的串的数量减去以当前节点为结束字符的串的数量
也就是代码中ans + sum - bo
AC代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>

using namespace std;
const int N = 1e4 + 10;
int s[N];
int m,n;
int ch[500010][2],cnt;
int sum[500010],bo[500010];
void insert(int len){
    int u = 0;
    for(int i = 0;i < len;i ++){
        if(ch[u][s[i]] == -1) ch[u][s[i]] = ++ cnt;
        u = ch[u][s[i]];
        sum[u] ++;
    }
    bo[u] ++;
}
int query(int len){
    int ans = 0;
    int u = 0;
    for(int i = 0;i < len;i ++){
        if(ch[u][s[i]] == -1) return ans;
        u = ch[u][s[i]];
        ans += bo[u];
    }
    return ans - bo[u] + sum[u];
}
int main(){
    scanf("%d%d",&m,&n);
    memset(ch,-1,sizeof(ch));
    for(int i = 0;i < m;i ++) {
        int x;
        scanf("%d", &x);
        for (int j = 0; j < x; j++) scanf("%d",&s[j]);
        insert(x);
    }
    for(int i = 0;i < n;i ++){
        int x;
        scanf("%d",&x);
        for(int j = 0;j < x;j ++)scanf("%d",&s[j]);
        printf("%d\n",query(x));
    }
    return 0;
}

P3065 [USACO12DEC]First! G

题目链接
思路:建立Trie树,然后假设某一串字典序最小,将它每一层的字符与同一层的字符建立有向边,可以得到一个有向图,再利用拓扑排序判断是否成环就行了
AC代码:
说实话拓扑排序的代码写起来挺有意思的

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>

using namespace std;
const int N = 3e4 + 10,M = 3e5 + 10;
int n,ans;
string s[N];
bool ok[N];
int tot,ch[M][26];
int in[26],e[26][26];
bool ed[M];
template <class T>
inline void read(T& res){
    res = 0;
    char c = getchar();
    int f = 1;
    while(c < '0' || c > '9'){
        if(c == '-') f = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9'){
        res = res * 10 + c - '0';
        c = getchar();
    }
    res *= f;
}
template<class T>
inline void write(T& x){
    if(x < 0){
        putchar('-');
        x = -x;
    }
    T y = 1;
    int len = 1;
    for(;y <= x / 10;y *= 10) len ++;
    for(;len;len --,x %= y,y /= 10) putchar(x / y + '0');
}
void insert(string x){
    int u = 0;
    for(int i = 0;x[i];i ++){
        int v = x[i] - 'a';
        if(!ch[u][v]) ch[u][v] = ++ tot;
        u = ch[u][v];
    }
    ed[u] = true;
}
queue<int> q;
void toposort(){
    while(!q.empty()) q.pop();
    for(int i = 0;i < 26;i ++)if(!in[i]) q.push(i);
    while(!q.empty()){
        int u = q.front();
        q.pop();
        for(int i = 0;i < 26;i ++){
            if(e[u][i]){
                -- in[i];
                if(!in[i]) q.push(i);
            }
        }
    }
}

bool check(string x){
    int u = 0;
    memset(e,0,sizeof(e));
    memset(in,0,sizeof(in));
    for(int i = 0;x[i];i ++){
        if(ed[u]) return false;
        int v = x[i] - 'a';
        for(int j = 0;j < 26;j ++){
            if(!e[v][j] && v != j && ch[u][j]){
                e[v][j] = 1;
                ++ in[j];
            }
        }
        u = ch[u][v];
    }
    toposort();
    for(int i = 0;i < 26;i ++) if(in[i]) return false;
    return true;
}
int main(){
    read(n);

    for(int i = 0;i < n;i ++){
        cin >> s[i];
        insert(s[i]);
    }
    for(int i = 0;i < n;i ++){
        if(check(s[i])){
            ans ++;
            ok[i] = 1;
        }
    }
    write(ans);
    putchar('\n');
    for(int i = 0;i < n;i ++){
        if(ok[i]) cout << s[i] << endl;
    }
    return 0;
}

相关推荐

TensorRT(C++)部署 Pytorch模型

众所周知,python训练pytorch模型得到.pt模型。但在实际项目应用中,特别是嵌入式端部署时,受限于语言、硬件算力等因素,往往需要优化部署,而tensorRT是最常用的一种方式。本文以yolov5的部署为例,说明模型部署在x86架构上的电脑端的流程。(部署在Arm架构的嵌入式端的流程类似)。

女神sha手的博客 5404

洛谷 题单 官方精选 字符串 Python实现

P5733 【深基6.例1】自动修正P1914 小书童——凯撒密码P1125 [NOIP2008 提高组] 笨小猴P1957 口算练习题P5015 [NOIP2018 普及组] 标题统计P5734 【深基6.例6】文字处理软件P1308 [NOIP2011 普及组] 统计单词数P1765 手机P3741 honoka的键盘P1321 单词覆盖还原P1553 数字反转(升级版)P1603 斯诺登的密码P1200 [USACO1.1]你的飞碟在这儿Your Ride Is HereP1

zhishichengjin的博客 2139

GEO优化实战:用AnswerBit量化AI搜索可见度与品牌监控体系

生成式引擎优化(GEO)正取代传统SEO,成为品牌在AI搜索生态中获取可见度的关键。当用户习惯从“翻列表”转向“直接问AI”,品牌能否被生成式引擎识别、引用并正向推荐,直接决定了其在用户决策链条中的存在感。AI搜索可见度因此从模糊概念演变为可度量的运营指标,涵盖提及率、引文率、情感分与回源质量等维度。腾讯AnswerBit作为答案侧分析工具,帮助运营者拆解AI回复中的品牌语境与引用来源,让优化动作有据可循。从内容结构化改造、品牌实体建设到第三方权威背书,GEO要求团队建立“度量-优化-再度量”的闭环。文章结

weixin_31100517的博客 148

洛谷P3065 First G

例如,Bessie发现,对于字符串串“omm”,“moo”,“mom”和“ommnom”,她可以使用标准字母表使“mom”排在第一个(即字典序最小),她也可以使用字母表“abcdefghijklonmpqrstuvwxyz”使得“omm”排在第一个。要计算字符串X和字符串Y按照重新排列过的字母表顺序来排列的顺序,先找到它们第一个不同的字母X[i]与Y[i],按重排后的字母表顺序比较,若X[i]比Y[i]先,则X的字典序比Y小,即X排在Y前;输入不包含重复的字符串。字符串应该按照它们在输入中的顺序来输出。..

lzx_xzl_______的博客 152

分数计算器(C++课设)

需求概述 (1)设计一个分数计算器,进行分数的算术运算和逻辑运算。 (2)能够像使用基本数据的对象一样,对分数进行“+”、“-”、“*”和“/”等算术运算和比较两个分数的大小。 (3)以a/b的形式输入输出分数,允许输入输出整数这种特殊形式。 (4)对不是约化型的分数进行约化,避免分母为负数。 (5)如果分数的分母为0、除数为0或输入时格式有错,采用异常处理机制解决。 输入 以分数的形式输入。(如1/2) 若分母为0会抛出异常,重新输入。 菜单页面 RationalNumber.h(头文件) #ifnd

sadnessss的博客 8769

MS17-010(Eternal blue永恒之蓝)漏洞利用+修复方法

msf永恒之蓝漏洞复现过程以及修复建议

记录学习 8506

Trie树(字典树)//洛谷P1481+洛谷P2580

第一行——咕咕咕。 第二行——慢慢学呗,还能离咋地。 Trie树:又称字典树,前缀树。是一种通过增加空间复杂度来减少时间复杂度的结构。其特点是根节点为空,其余节点存一个字符,节点与节点之间的路径是一个字符(一般是用于字符串)。 建树:令根节点为空,从该点出发,将新的字符串上的字符一个个加入,未出现过即直接相连,出现过找到最末尾的共享字符,连接即可。 性质:1.从根节点到某节点的路径即...

MoonLight_月亮 1035

Python 爬虫实战:爬取豆瓣读书评论并分析

摘要:本文以豆瓣读书《活着》评论数据为例,详细讲解Python爬虫开发与文本分析全流程。首先通过requests库爬取评论数据,解决分页、反爬等问题;然后利用BeautifulSoup解析页面提取评论内容、评分等核心信息;最后结合jieba进行关键词提取、snownlp完成情感分析,并通过可视化展示结果。分析显示该书评分以5星为主(占比70%),正面评论达82%,核心关键词为"活着""余华""生命"。全文包含完整代码与详细解析,帮助读者掌握非结构化

2503_91057718的博客 1496

manacher算法(洛谷P3805)

注:本文中讨论字符串下标均从1开始 简介: manacher算法,主要用于求解字符串中回文串相关的问题,可以在O(n)O(n)O(n)的时间复杂度下处理出以字符串每个字符为中心的最长回文串 基础概念与辅助变量: 考虑到长度为奇、偶的字符串不好统一表示,我们在原字符串的每两个相邻字符中间加上一个符号(这里选的是#),这样任意一个回文串就都有一个确定且唯一的回文中心(即中间的字符),这里我们定义奇长度...

一只蒟蒻的博客 211

【txt文本加密】使用 cryptography 库实现加密和解密

cryptography 库是一个强大的 Python 库,用于实现加密和解密功能。它提供了各种加密算法,包括对称加密、非对称加密、哈希函数等。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 2666

基于YOLOv8的智能肿瘤检测系统:从图像到诊断的深度学习应用——含代码和论文

本文提出了一种基于YOLOv8深度学习的智能肿瘤检测系统,用于医学影像(CT/MRI/X光)的自动分析与诊断。针对传统人工阅片效率低、主观性强的问题,系统采用最新的YOLOv8目标检测算法,通过改进的C2F骨干网络、Anchor-Free检测头和解耦头等创新设计,实现高效精准的肿瘤定位。文章详细阐述了模型架构、数据处理流程、训练优化方法及PyQt5用户界面开发,为临床提供可靠的AI辅助诊断工具。实验结果表明,该系统在速度和准确率上达到良好平衡,有望提升肿瘤早期筛查效率。

FJN110的博客 199

trie树(字典树) 洛谷 P3879 [TJOI2010] 阅读理解

我之前发布了关于算法实现的文章,Trie树和KMP算法都是用于字符串匹配的算法,它们可以在一定程度上互相补充和优化。👇👇👇洛谷P3375 【模板】KMP_洛谷 p3375-优快云博客算法的原理在上述博客中已经讲清,本篇博客用来讲解trie树算法正如它字面意思,把字符串按照字典的顺序存放在一棵树上,通过每个单词和其他单词的公共前缀把他们连接起来,如图所示如图所示: apple: appear: cat: bus: banana。

ByteMaster_的博客 1014

一键生成Microsoft Store应用直链下载:绕过商店故障的终极方案

遇到商店无法加载时,复制链接 → 粘贴到Adguard → 下载主程序包 → 开启开发者模式安装。整个过程耗时不超过2分钟,彻底摆脱商店依赖!

安德洛夫 2183

【洛谷 P3805】 【模板】manacher算法

题目链接 manacher算法:在线性时间内求一个字符串中所有/最长回文串的算法。 先来考虑一下暴力的算法,枚举每个中点,向两边扩展,时间复杂度\(O(n^2)\)。 来分析下此算法的缺点。 1、因为回文串有奇偶之分,所以要分类讨论,\(abba\)的对称轴不在字符上,分类讨论就会有点麻烦。 为此,\(manacher\)算法的解决方案是在每个字符之间插入一个相同的字符,比如说\(\#\), \(...

weixin_33884611的博客 141

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

专题·马拉车(manacher)【including 洛谷·【模板】manacher算法

专题·马拉车算法 洛谷P3805 【模板】manacher算法

樱狸✨愿携清风归来处 503

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

AcWing 3188:Manacher 算法 → 最长回文子串

Manacher算法,谐称马拉车算法,是用于在 O(n) 时间复杂度内找到字符串中最长回文子串的高效算法。

hnjzsyjyj的专栏 1848

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Manacher算法学习笔记(洛谷题单 Part 5.3 Manacher)

字符串回文最基础的算法--Manacher算法

Dawn的博客 1220

洛谷试炼日记(trie树和AC自动机)(解题报告)

文章目录**Trie树**P4407 [JSOI2009]电子字典P4551 最长异或路径**AC自动机**P5357 【模板】AC自动机(二次加强版)P3121 [USACO15FEB]Censoring G Trie树 P4407 [JSOI2009]电子字典 题目链接 第一次近距离接触树上dfs,之前可能接触过但是没仔细了解,就是用dfs枚举,因为题目说目标串可以改动之后变为字典树里的串 所以对目标串进行dfs就行啦 细节看代码就好 AC代码: #include<iostream> #in

juruo_c的博客 386

Trie树简介 ( 洛谷P2580题解 )

又称单词查找树,字典树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。

forezxl的博客 943

洛谷[3879] [TJOI2010]阅读理解(trie树模板)

题目链接:luogu3879P3879 [TJOI2010]阅读理解时空限制 2s / 128MB题目描述英语老师留了N篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过。 输入输出格式输入格式:第一行为整数N,表示短文篇数,其中每篇短文只含空格和小写字母。 按下来的N行,每行描述一篇短文。每行的开头是一个整数L,表示这篇短文由

永无止境 1039

洛谷P5149——会议座位【字典树 + 逆序对】

洛谷P5149——会议座位 大致思路:我们先用字典树把单词存起来,在每个单词的末尾节点给这个单词按照出现顺序标号,然后在查找的过程中,把其出现顺序用一个数组一次存起来,然后求这个数组的逆序对即可。 #include &lt;algorithm&gt; #include &lt;cstdio&gt; #include &lt;iostream&gt; #include &lt;cstring&...

xiang_hehe的博客 483

#manacher#洛谷 3501 ANT-Antisymmetry

题目 求在异或意义下的回文子串的数量 分析 大佬的博客 首先为了方便,在字符之间加上分隔符,这样就变成了一个奇数串,并且处理越界于是在前面加上特殊符号,然后后面关键是扩张半径的时候要注意变式就没了 代码 #include &amp;lt;cstdio&amp;gt; #include &amp;lt;cstring&amp;gt; #include &amp;lt;algorithm&amp;gt;

lemondinosaur的博客 293

manacher算法 洛谷3805 manacher

Description给出一个只由小写英文字符a,b,c…y,z组成的字符串S,求S中最长回文串的长度.字符串长度为nInput一行小写英文字符a,b,c…y,z组成的字符串SOutput一个整数表示答案Data Constraint字符串长度len <= 11000000Solutionmanacher裸题,纯粹找手感Code#include <stdio.h> #include <string.

olahiuj的博客 440

Trie树模板

Trie树,包括插入查找

fcbruce 1438

洛谷 1666 前缀单词 trie树 dp

题目链接 题意: 给你n个字符串,每次选出若干个字符串形成一个集合,问有多少个集合满足集合中的任何一个字符串都不是另外一个字符串的前缀。空集也一定是满足条件的。保证不会出现两个相同的字符串。 题解: 也是NOIP模拟赛出现的题。当时想到了建trie树之后dp(我也忘了是怎么想到的了),但是当时我感觉算互相不为前缀可能不太好算,于是就在考虑用集合总数减去存在互为前缀的集合,结果发现自己dp计...

forever_shi的博客 335

回文匹配,洛谷P6216,kmp+manacher+树状数组维护

看到题解O(n+m)O(n+m)O(n+m)的跑的比我慢,我就放心了 我的时间复杂度是O((n+m)log⁡n)O((n+m)\log n)O((n+m)logn)的,而且很好想 首先我们考虑对于一个s2s2s2在s1s1s1出现的区间[l,r][l,r][l,r],对于一个回文中心i的贡献,显然两个端点哪个离中心更远,就应该在哪个上算贡献,从左往右遍历每一个我们只需要在中间点的右边一个点切换一下即可 一个区间[l,r][l,r][l,r]对回文中心iii的贡献具体应该是: 用[i−mx[i],i+mx[i

Deep_Kevin的娱乐空间 253
上一篇: 字符串哈希
下一篇: 洛谷试炼日记(trie树和AC自动机)(解题报告)
juruo_c
博客等级 码龄6年 520粉丝 116原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值