「Codechef April Lunchtime 2015」Palindromeness

「Codechef April Lunchtime 2015」Palindromeness

解题思路 :

考虑对于回文子串 \(s\) 贡献的定义:
\[
value_s = [\ s[1,\lfloor \frac{|s|}{2}\rfloor]\text{ is palindrome}]\times value_{s[1,\lfloor \frac{|s|}{2}\rfloor]} + 1
\]
也就是说对于每一个回文子串,只需要判断其前一半的字符是不是回文串并得到贡献即可。

于是建出回文树,可以通过跳 \(fail\) 得到其所有回文前缀,用倍增找到第一个长度小于等于一半的回文前缀,判断其长度是否恰好是一半并继承贡献。

令 \(size_u\) 表示回文树上一个节点所代表的回文串的 \(right\) 集合大小,则
\[
Ans =\sum_{u \text{ in pam}} size_u \times value_u
\]
总复杂度 \(O(|s|log|s|)\) 。

/*program by mangoyang*/
#include<bits/stdc++.h>
#define inf ((int)(1e9))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
    int f = 0, ch = 0; x = 0;
    for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
    for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
    if(f) x = -x;
}
const int N = 200005;
char s[N];
namespace PAM{
    ll ans;
    int ch[N][26], sz[N], fa[N], len[N], f[N][21], val[N], size, tail;
    inline int newnode(int x){ return len[++size] = x, size; }
    inline void init(){
        memset(ch, 0, sizeof(ch));
        memset(fa, 0, sizeof(fa));
        memset(sz, 0, sizeof(sz));
        len[1] = -1, fa[0] = 1, size = tail = 1, ans = 0;
    }
    inline void pushback(int pos){
        int c = s[pos] - 'a', p = tail;
        while(s[pos-len[p]-1] != s[pos]) p = fa[p];
        if(ch[p][c]) return (void) (sz[tail=ch[p][c]]++);
        int np = newnode(len[p] + 2), u = fa[p];
        while(s[pos-len[u]-1] != s[pos]) u = fa[u];
        fa[np] = ch[u][c], sz[tail=ch[p][c]=np]++;
    }
    inline void solve(){
        for(int i = 1; i <= size; i++) f[i][0] = fa[i];
        for(int j = 1; j <= 20; j++)
            for(int i = 1; i <= size; i++)
                f[i][j] = f[f[i][j-1]][j-1];
        for(int i = 2; i <= size; i++){
            val[i] = 1; int x = i;
            for(int j = 20; ~j; j--)
                if(len[f[x][j]] >= len[i] / 2) x = f[x][j];
            if(len[x] == len[i] / 2) val[i] += val[x];
        }
        for(int i = size; i > 2; i--) sz[fa[i]] += sz[i];
        for(int i = 2; i <= size; i++) ans += 1ll * val[i] * sz[i];
        cout << ans << endl;
    }
}
int main(){
    int T; read(T);
    while(T--){
        scanf("%s", s + 1); int n = strlen(s + 1);
        PAM::init();
        for(int i = 1; i <= n; i++) PAM::pushback(i);
        PAM::solve();
    }
    return 0;
}

原文地址:https://www.cnblogs.com/mangoyang/p/10165325.html

时间: 2024-08-29 15:24:09

「Codechef April Lunchtime 2015」Palindromeness的相关文章

「中国移动互联网测试大会」报名开始啦!

报名入口 时至北京初夏,一场由 TesterHome 主办的关于移动互联网测试技术的盛会即将开幕.只要你关注质量,热爱测试,期待学习,都欢迎你加入这次移动测试技术大会中和我们一起分享经验.探讨话题,结识业界朋友. 「Mobile Testing Summit China 2015」中国移动互联网测试大会 大会定位:专注移动互联网测试技术的分享会,关注移动互联网质量的有志之士的集会. 大会主旨:秉承着务实.能落地.有深度.高质量.重分享的原则与广大测试工程师做最新最实用的分享与交流,以推广新鲜实用

「中国移动互联网测试大会」议题征集开始啦!

时至北京初夏,一场由 TesterHome 主办的关于移动互联网测试技术的盛会即将开幕.只要你关注质量,热爱测试,期待学习,都欢迎你加入这次移动测试技术大会中和我们一起分享经验.探讨话题,结识业界朋友. 「Mobile Testing Summit China 2015」中国移动互联网测试大会 大会定位:专注移动互联网测试技术的分享会,关注移动互联网质量的有志之士的集会. 大会主旨:秉承着务实.能落地.有深度.高质量.重分享的原则与广大测试工程师做最新最实用的分享与交流,以推广新鲜实用的测试技术

iOS 模块分解—「Runloop 面试、工作」看我就 &#128018; 了 ^_^.

释义: Run loops 是线程相关底层基础的一部分.它的本质和字面意思一样运行着的循环(事件处理的循环),作用:接受循环事件和安排线程的工作.目的:让线程在有任务的时候忙于工作,而没任务的时候处于休眠状态. Run loop 的管理并非完全自动.你仍然需要设置线程代码在合适的时候启动 run loop 来帮助你处理输入事件.iOS 中 Cocoa 和 CoreFoundation 框架中各有完整的一套关于 runloop 对象的操作api,在主线程中 run loop 是自动创建并运行(在子

CSS无需Webfont实现近似「微软雅黑Light」的字体效果

在网页制作中,美观的字体能很大程度上提升一个网页的整体外观浏览效果(说白了就是提升逼格),但受各种因素的影响(例如中文字体应用Webfont的麻 烦),使开发者在制作过程中不得不使用“Web安全字体”,这使网页的外观效果大幅下降.今天在改模板的过程中偶然发现一个很笨的方法,实现近似微软雅黑 Light的字体效果. 实际上「微软雅黑Light」字体就是相对于「微软雅黑」字体较细,但是它的显示效果却要让人觉得舒适很多,只要字体不会太小,显示效果还是不错的. 所以直接用font-weight属性设置字

Linux 小知识翻译 - 「协议(protocol)」

对于理解服务器和网络来说,「协议」是不可缺少的概念. 「协议(protocol)」有「规则,规定」的意思. 实际上「协议」的函数很广,在通信领域,「协议」规定了「在通信时,什么样的情况下,以什么样的顺序,什么样的方式交互什么样的数据」. 抽象的去理解「协议」可能会比较困难,下面来举个例子. 通过Web以HTML方式交互时使用的协议是「HTTP」(Hyper Text Transfer Protocol).这个协议最重要的就是规定了服务器和客户端之间以HTML方式交互的规则. 比如,客户端连接上服

苹果搜索广告后台大揭秘,最全最细致详解,手把手设置教程「后附官方视频」-b

WWDC2016 搜索广告分会视频和 PPT 发布了,ASO100 带开发者第一时间了解 Search Ads 后台设置(文末有原声视频). 首先介绍一下搜索广告的模式和竞价规则 广告模式为 CPT(Cost Per Tap,按点击收费),类似于国内的 CPC 广告模式.广告的展示受两个因素的影响:相关性与出价. 如下图,所有相关性低的广告都不被展示(无论出价高低),相关性相差不多时,展示出价高的广告. 苹果根据两方面来判断相关性,一是 App 文本的元数据(来源于描述等位置),二是用户点击广告

翻译「C++ Rvalue References Explained」C++右值引用详解 Part1:概述

本文系对「C++ Rvalue References Explained」 该文的翻译,原文作者:Thomas Becker. 该文较详细的解释了C++11右值引用的作用和出现的意义,也同时被Scott Meyers推荐,全文共分11个部分,我将利用业余时间,分别翻译. 受笔者水平所限,可能叙述会出现些许问题,还望多多指正. 部分名词为了保持含义和方便理解,并未翻译成中文,有的在括号内给出了常见的中文翻译. 目录 概述 Move语义 右值引用 强制Move语义 右值引用就是右值吗? Move语义

XCActionBar 「Xcode 中的 Alfred」

下载地址:https://github.com/pdcgomes/XCActionBar 基本命令: (1)「command+shift+8」或者双击「command」键可以打开「动作输入框窗口」 (2)「command+option+7」或者双击「alt」键可以执行「上次的动作」 编程时可用于双击或三击事件的按键分别为如下5个: (1)「alt」:NSAlternateKeyMask (2)「command」:NSCommandKeyMask (3)「control」:NSControlKey

通俗解释「为什么数据库难以拓展」

"如何通俗解释「为什么数据库难以拓展」",这个问题来自 Quora,题主还补充说自己有一些数据库的基本知识,但依然不理解为什么扩展数据库如此困难.伯乐在线编译摘编了这个问答贴的两个热门回复. Paul King , Facebook 数据科学家(3.6K 赞) 要扩展数据库有四大挑战:搜索.并发性.一致性和速度. 假设你有一张清单,上面有10个人名.如果你想要查找某个人,只需要看一眼清单就行. 但如果清单上有100万个人名呢?这时,你就需要一些策略了.电话簿把人名按照字母顺序排列,这样