BZOJ 2342 [Shoi2011]双倍回文(manacher+堆+set)

news/2024/7/7 12:54:46

题意

N<=500000

 

题解

维护一个set可以用堆来解决。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<set>
 7 #include<queue>
 8 using namespace std;
 9 const int N=500100;
10 int str[N*2],m,p[N*2];
11 int n,f[N],now,ans;
12 char s[N];
13 struct hhh{
14     int l,r;
15     bool operator <(const hhh &a)const{
16         return a.r<r;
17     }
18 }c[N];
19 set<int> se;
20 priority_queue<hhh> q;
21 void init(){
22     str[0]=str[1]='#';
23     for(int i=1;i<=n;i++){
24         str[i*2]=s[i];
25         str[i*2+1]='#';
26     }
27     m=n*2+1;
28 }
29 void manacher(){
30     int mx=0,id;
31     for(int i=1;i<=m;i++){
32         if(mx>i)p[i]=min(p[id-(i-id)],id+p[id]-i);
33         else p[i]=1;
34         while(str[i-p[i]]==str[i+p[i]])p[i]++;
35         if(i+p[i]-1>mx)mx=i+p[i]-1,id=i;
36     }
37 }
38 int main(){
39     scanf("%d",&n);
40     scanf("%s",s+1);
41     init();
42     manacher();
43     for(int i=1;i<=n;i++){
44         f[i]=p[i*2+1]/2;
45         c[i].l=i;
46         c[i].r=i+f[i];
47     }
48     for(int i=1;i<=n;i++){
49         if(i-1+f[i-1]>=i){
50             se.insert(i-1);
51             q.push(c[i-1]);
52         }
53         while(!q.empty()&&q.top().r<i){
54             se.erase(q.top().l);
55             q.pop();
56         }
57         set<int>::iterator it=se.lower_bound(i-f[i]/2);
58         if(it!=se.end()){
59             ans=max(ans,(i-*it)*4);
60         }
61     }
62     printf("%d",ans);
63     return 0;
64 }

 

转载于:https://www.cnblogs.com/Xu-daxia/p/9555168.html


http://www.niftyadmin.cn/n/4557278.html

相关文章

c.k死了没.

||| over了 很神奇 别去猜测时间能够说明一切问题&#xff0e;

(9)Spring框架——MyBatis的学习

目录 一、概述 &#xff08;一&#xff09;项目准备工作 &#xff08;二&#xff09;项目结构描述 &#xff08;三&#xff09;具体作用概述 二、举例 &#xff08;一&#xff09;步骤 &#xff08;二&#xff09;实例 一、概述 &#xff08;一&#xff09;项目准备工作…

一个C++编程问题

而现在的方法是 按引用调用 (call by reference) 传递 即将实参复制给形参 如果去掉就编程 使用按值调用 (call by value) 来传递参数了 这样形参才能改变实参的值 这样实参的值不会被形参改变

HDU 2612 find a way 【双BFS】

<题目链接> 题目大意&#xff1a;两个人分别从地图中的Y 和 M出发&#xff0c;要共同在 处会面&#xff08;不止有一处&#xff09;&#xff0c;问这两个人所走距离和的最小值是多少。 解题分析&#xff1a; 就是对这两个点分别进行一次BFS&#xff0c;求出它们到每一个…

(10)Spring框架——MyBatis的学习之动态SQL

目录 一、描述 1、准备工作 2、总体思路 3、我出现的问题 二、步骤 1、根据项目结构建包&#xff0c;建类。 2、外部引入文件 三、实例 1、区别 一、描述 1、准备工作 &#xff08;1&#xff09;环境配置——相互作用 a.其中mybatis-config.xml&#xff08;配置数据…

(11)Spring框架——MyBatis的学习之动态SQL

目录 一、动态SQL的元素 二、实例 1、项目结构 2、建包建类 3、配置文件 一、动态SQL的元素 元素作用<if>是判断语句&#xff0c;当满足了条件就会执行标签里面的动态SQL <choose><when> <otherwise> <when>会进行多层判断&#xff0c;最后…

Go语言基础:method

我们在C语言中&#xff0c;struct中声明函数&#xff0c;而Go中则不能再struct中声明函数。而是采用另外一种形态存在&#xff0c;Go中叫method。 method的概念 method是附属在一个给定的类型上&#xff0c;语法和函数的声明语法几乎一样&#xff0c;只是再func后面增加了一个r…

输出1~50之间的质数。 用for循环语句编写

跳出循环 break; }if(ij)//当ij的时候就说明是质数了System.out.println(i);//输出质数就ok了} ||| 学习学习.. ";} } ||| 主要的方法体如下int i i); } } 答案补充 C 格式public class Test { public static void main(String[] args) { for(int k 50; --k > 2;) { i…