首页 > 其他分享 >[CF17E] Palisection 题解

[CF17E] Palisection 题解

时间:2023-12-21 21:58:49浏览次数:39  
标签:tmp int 题解 tot Palisection CF17E mod include 回文

[CF17E] Palisection 题解

思路

直接统计相交的字符串很难数,考虑正难则反。

用总共的回文串对数减去相离的回文串个数。

设总共有 \(tot\) 个回文串,用 manacher 跑出来每个位置的最大回文半径后,使用差分的技巧保存两个数组:

\(f_i\) 表示以 \(i\) 为开头的回文串个数,\(g_i\) 表示以 \(i\) 为结尾的回文串个数。

所以如果固定了两对相离回文串中第一个回文串的结尾,只需要让另一个回文串的开头在第一个结尾的后面,所以答案就是:

\[\binom{tot}{2} - \sum_{i = 1}^n f_i\sum_{j = i + 1}^ng_j \]

可以用前缀和优化,时间复杂度 \(O(n)\)。

// Problem: Palisection
// Author: Moyou
// Copyright (c) 2023 Moyou All rights reserved.
// Date: 2023-12-20 23:50:56

#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int N = 4e6 + 10, mod = 51123987;

int n, d[N], f[N], g[N];
long long tot;
string s, tmp;

signed main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n >> s;
    tmp = "$#";
    for(int i = 0; i < s.size(); i ++)
        tmp += s[i], tmp += "#";
    swap(tmp, s);
    d[1] = 1;
    for(int i = 2, l = 0, r = 0; i < s.size(); i ++) {
        if(i <= r) d[i] = min(r - i + 1, d[r - i + l]);
        while(s[i - d[i]] == s[i + d[i]]) d[i] ++;
        if(i + d[i] - 1 >= r) r = i + d[i] - 1, l = i - d[i] + 1;
    }
    n = s.size();
    for(int i = 1; i <= n; i ++) {
        (tot += d[i] / 2);
        f[i - d[i] + 1] ++, f[i + 1] --; // 以 i 为开头
        g[i] ++, g[i + d[i]] --; // 以 i 为结尾
    }
    for(int i = 1; i <= n; i ++) {
        f[i] = (f[i - 1] + f[i]) % mod;
        g[i] = (g[i - 1] + g[i]) % mod;
    }
    for(int i = n; i >= 1; i --) 
        if(isalpha(s[i])) f[i] = (f[i + 2] + f[i]) % mod;
    int ans = ((__int128)tot * (tot - 1) / 2) % mod; // mod 不是质数我谔谔
    for(int i = 1; i <= n; i ++)
        if(isalpha(s[i]))
            ans = (ans - 1ll * g[i] * f[i + 2] % mod) % mod;
    cout << (ans + mod) % mod << '\n';
    return 0;
}

标签:tmp,int,题解,tot,Palisection,CF17E,mod,include,回文
From: https://www.cnblogs.com/MoyouSayuki/p/17920195.html

相关文章

  • CF187A 题解
    原题传送门题目大意如题意翻译。思路分析很水的一道题目,可以将第一个排列\(a\)看作最终排列,接下来每输入一个数,让它与\(a_m\)进行比较,直到两个排列相同。最后看题目范围,\(1≤n≤2\times10^5\),时间复杂度\(\mathcal{O(n)}\),空间复杂度\(\mathcal{O(n)}\)。代码:/*Writ......
  • CF1912L 题解
    原题传送门题目大意有一个仅有0和L构成的序列,求出一种方案,使得左部分的0数量不等于右部分的O数量,且左部分的L数量不等于右部分的L数量,若不存在输出-1。思路分析首先看题目范围,\(2≤n≤200\),数据很小,考虑暴力。可以使用字符串截取函数s.substr()。本题我们使......
  • P5289 [十二省联考 2019] 皮配 题解
    题目链接点击打开链接题目解法题意比较复杂,形式化一下题意是:一些人和一些城市,每个人属于一个城市,每个人属于\(A/B/C/D\)队,需要满足:每个城市中的人要么都属于\(AC\)或\(BD\),且\(A+C\leC_0,\;B+D\leC_1,\;A+B\leD_0,\;C+D\leD_1\)暴力\(dp\)是\(f_{i,a,b,c}\)表......
  • 2023第七届强网杯 个人题解
    27htppySpring评价:相对简单,放出来的晚,做的出来的人相对比较少大致流程是可以上传.pebble模板文件,然后通过访问上传的恶意模板文件进行rce。首先上传恶意模板文件,经过几次尝试,黑名单过滤了,org.springframework.context.support.ClassPathXmlApplicationContext和{{最终.pe......
  • CF1914 D Array Collapse 题解
    LinkCF1914DArrayCollapseQuestion初始给出一个数组\(\{P\}\),数组中每个值都不相同,我们可以选中\(P\)数组中连续的一段,然后删除除了最小值以外的所有元素,求删除多次(包括\(0\)次)后,剩下的数组的数量Solution当时就没怎么往DP方面想,没想到还能这样DP定义\(F[i]\)......
  • P9973 [THUPC 2024 初赛] 你说得对,但是 AIGC の 题解
    难度极低。显然,句子开头是Youareright,but即为人工智能。#include<iostream>#include<string>#include<cstdio>namespaceio{template<typenameT>inlinevoidread(T&x){x=0;boolf=false;charch=getchar();while(ch<'0......
  • P4147 玉蟾宫 题解
    P4147玉蟾宫题解题目链接P4147玉蟾宫简要思路很容易发现,这是最大子矩形问题的板子题。定义一个二维的\(dp\)数组,\(dp_{i,j}\)代表以坐标\((i,j)\)为底的线段,最长能向上延伸多少个单位长度的F(如果自身为R,值则为\(0\))。对于\(dp\)数组的维护,分为两种情况:当\(......
  • THUPC 2024 初赛部分题解和游记
    我们队赛时被J题创死了awa离做出来差一个剪枝,而且赛后试了试不加剪枝甚至能过……6题离场。一些题解J套娃先对\([0,n]\)中每个数\(k\)分别考虑。假设总共出现了\(c\)次\(k\),第\(i\)次出现的位置是\(pos_{i}\),(令\(pos_0=0,pos_{c+1}=n+1\)),则只有处在\(pos_{......
  • 软件测试/测试开发|selenium NoSuchDriverException问题解决
    前言我们在使用selenium进行web自动化测试时,有时候会遇到NoSuchDriverException的问题,这个异常通常是由于WebDriver无法找到指定的浏览器驱动而引起的。在这篇文章中,我们将讨论NoSuchDriverException的原因以及如何解决这个问题。NoSuchDriverException是什么?NoSuchDriverException......
  • 华中师范大学2023新生赛 I 镜面折跃 题解
    Link华中师范大学2023新生赛I镜面折跃Question懒得转述了Solution确实是一道好题可以把一节方格拆成\(4\)个点,每个点分别代表从四个方向射进这个节点的光线如果没有镜子,那么就左侧节点的右侧连接自己的右侧,以此类推如果有镜子,那么顺着镜子方向建边,边权为\(0\),向\(9......