ZZULI 1876: 蛤玮的项链 Hash + 二分

Time Limit: 6 Sec  Memory Limit: 128 MB
Submit: 153  Solved: 11

SubmitStatusWeb Board

Description

蛤玮向心仪的妹子送了一条项链,这条项链是由小写字母构成的首尾相接的字符串,妹子看了看项链对蛤玮说,"我希望它是对称的",蛤玮想了想之后决定,从项链上截取出一段,这段如果是回文的话那么妹子戴起来就是对称的了.由于蛤玮会魔法,他可以把项链上的某一个字母变成任意另一个字母,但由于魔力限制他最多只能变两次,现在蛤玮想知道他能截取出的项链的最长长度是多少.为了简单,我们假设蛤玮截取出的长度必须是奇数.

 

Input

 

第一行整数T(1<=T<=10),表示数据组数.

 

每组数据一个字符串s,表示项链,|s|<=100000.

 

Output

每组数据输出一个数,最长的截取长度.

 

Sample Input

1
abcdaaa

Sample Output

7

HINT

 

样例串改变一个字母变成abcbaaa,整个项链便可转成回文aabcbaa.

 

思路:(dzs教我的)。由于是循环的,那么将s变为ss,类似用hash求以i为中心的最长回文的长度,对于每一个位置i,先二分到pos1,那么pos1-i-(i-pos1+i)为当前的回文段,pos1-=2,相当于修改一次操作,继续二分到一个位置pos2.如此做两次,就相当于两次修改操作

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#include <string>
using namespace std;
const int x = 123;
const int N = 200005;
unsigned long long H1[N], H2[N], xp[N];
char s[N];
int n, m;
void initHash() {H1[n] = H2[n] = 0;int t = 0;for(int i = n - 1; i >= 0; --i) {H2[i] = H2[i + 1] * x + s[i];H1[i] = H1[i + 1] * x + s[t++];}xp[0] = 1;for(int i = 1; i <= n; ++i) xp[i] = xp[i - 1] * x;
}
unsigned long long getHash(int i, int L, int f) {unsigned long long h;if(f == 1)h = H1[i] - H1[i + L] * xp[L];elseh = H2[i] - H2[i + L] * xp[L];return h;
}
void init() {scanf("%s", s);m = strlen(s);for(int i = 0; i < m; ++i) s[i + m] = s[i];n = m << 1;initHash();
}
int get(int i) {int L = 0, R = i + 1;while(R - L > 1) {int M = (L + R) >> 1;if(n - i + M <= n && i + 1 + M <= n && getHash(n - i, M, 1) == getHash(i + 1, M, 2))L = M;else R = M;}return L;
}
int change(int i, int cen) {int L = 0, R = i + 2;while(R - L > 1) {int M = (L + R) >> 1;if(n - i - 1 + M <= n && 2 * cen - i + M <= n && getHash(n - i - 1, M, 1) == getHash(2 * cen - i, M, 2))L = M;else R = M;}return L;
}
int solve() {int pos1, pos2, pos3, ls1, ls2;if(m <= 5) return m;int ans = 5;for(int i = 3; i < n; ++i){int x = get(i);pos1 = i - x;if(x + 2 + i < n) pos1 -= 2;ls1 = change(pos1, i);pos2 = pos1 - ls1 + 1;if(pos2 == 1 && i - pos2 + i + 1 < n) pos3 = 0;else if(pos2 == 0) pos3 = pos2;else {pos3 = pos2;if(i - pos2 + i + 2 < n) {pos2 -= 2;ls2 = change(pos2, i);pos3 = pos2 - ls2 + 1;}}ans = max(ans, (i - pos3) * 2 + 1);}return min(m, ans);
}
int main() {// freopen("in", "r", stdin);int _; scanf("%d", &_);while(_ --) {init();int ans = solve();if(ans % 2 == 0) ans--;printf("%d\n", ans);}return 0;
}/**************************************************************Problem: 1876User: atrpLanguage: C++Result: AcceptedTime:2676 msMemory:6208 kb
****************************************************************/
View Code

 

转载于:https://www.cnblogs.com/orchidzjl/p/5483554.html

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

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

相关文章

python调用菜单响应事件_Python处理菜单消息操作示例【基于win32ui模块】

本文实例讲述了Python处理菜单消息操作。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 一、代码 # -*- coding:utf-8 -*- #! python3 import win32ui import win32api from win32con import * from pywin.mfc import window class MyWnd(window.Wnd): def __init__ (…

全连接条件随机场_条件随机场CRF简介

作者&#xff1a;Ravish Chawla编译&#xff1a;ronghuaiyang导读一个简单明了的对条件随机场的说明&#xff0c;给大家一个非常直观的印象&#xff0c;CRF到底是个什么东西&#xff0c;能干什么用。条件随机场是一种用于序列预测的判别模型。它们使用来自以前标签的上下文信息…

PHP文件下载过滤类

Java代码 <?php /** $filename index.php; $download new Download(php,exe,html, false); if (!$download->downloadfile($filename)) { echo $download->getErrorMsgs(); } */ class Download { private $debug false; private $errorMsg ; …

解决outlook2013设置错误无法启动

今天在新的机器上安装office 2013&#xff0c;在进行outlook2013账户设置时&#xff0c;账户设置错误导致无法正常启动outlook。 查询相关资料发现可以通过&#xff0c;控制面板用户帐户和家庭安全—邮件&#xff0c;重新设置账户即可。 相关操作如下图&#xff1a;

论文公式编号右对齐_论文不会写?最详细的论文排版技巧

说明本文根据严思奇在2017年在"重庆邮电大学硕士学位论文"撰写期间的粗陋经验总结而作。使用的word版本为word2016。在使用时&#xff0c;首先应该根据第2章&#xff0c;按照顺序设置好所有需要全局设定的内容。然后再论文写作中&#xff0c;会依次碰到参考文献、公式…

ESXI开启SNMP服务

要监控ESXI&#xff0c;打算通过snmp方式进行监控&#xff0c;这样操作比较简单。但是要使用SNMP方式进行监控&#xff0c;必须要开启ESXI的SNMP服务。ESXI由于版本号的不同&#xff0c;SNMP开启的方法也不尽相同。 我们先来介绍ESXI5.0开启方法。在开启之前&#xff0c;我们先…

fiddler修改支付金额_不容忽视的记账工具:支付宝记账

上一篇文章我们说到&#xff0c;微信记账是一个省心省力省时间的好工具&#xff0c;但平时我们的支付手段可能不只有微信&#xff0c;最常用的还有支付宝&#xff0c;例如我们在双十一淘宝上购物的话基本上使用的是支付宝进行付款&#xff0c;因此为大家普及一下支付宝的记账流…

python单步调试的方法_python断点调试方法

pdb 是 python 自带的一个包&#xff0c;为 python 程序提供了一种交互的源代码调试功能&#xff0c;主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等。pdb 提供了一些常用的调试命令&#xff0c;详情见表 1。下面结合具体的实例…

数加移动定向营销:如何快速搭建不完全依赖用户历史行为的个性化服务

移动定向营销是一款基于规则引擎面向移动应用做流量精准运营的数据服务&#xff0c;能帮助使用者灵活划分用户群体、细分用户流量。移动定向营销原理它是一种定向的、人为可控的、可解释的&#xff0c;并且不完全依赖于用户历史行为、不受投放内容约束、面向用户的个性化服务方…

python读写json_python 读写json数据

json 模块提供了一种很简单的方式来编码和解码JSON 数据。 字符串操作 其中两个主要的函数是json.dumps() 和json.loads() &#xff0c;要比其他序列化函数库如pickle 的接口少得多。下面演示 1.如何将一个Python 数据结构转换为JSON 2.如何将一个JSON 编码的字符串转换回一个P…

java web逻辑删除代码_MyBatis-Plus之逻辑删除的实现

特别是互联网项目&#xff0c;对于数据一般是不能删除的(涉及到后面的数据分析)&#xff0c;这就涉及到逻辑删除。所谓逻辑删除指的是数据并不是真正的删除&#xff0c;只是改数据表对应数据的状态(数据表中通常有一列叫delFlag,以此标识正常状态或删除状态)。逻辑删除一般都是…

debian安装java jdk_Linux(Centos、Debian)之安装Java JDK及注意事项(转)

a.因为Java JDK区分32位和64位系统&#xff0c;所以在安装之前必须先要判断以下我们的Centos、Debian系统为多少位系统&#xff0c;命令如下&#xff1a;uname -a解释&#xff1a;如果有x86_64就是64位的&#xff0c;没有就是32位的。后面是X686或X86_64则内核是64位的&#xf…

python预定义_【Python】python类中方法的预定义

知乎问题&#xff1a;像这个图片里面显示的&#xff0c;self.prediction首先声明了下然后下面给出了定义&#xff0c;然后optimize又调用这个函数但是没有用self.prediction()这样的方式而是像用变量一样直接用self.prediction&#xff0c;,像请教一下这是什么操作&#xff1f;…

python md5加密_Python MD5加密实例详解

详解Python MD5加密 Python 3下MD5加密 # 由于MD5模块在python3中被移除 # 在python3中使用hashlib模块进行md5操作 import hashlib # 待加密信息 str this is a md5 test. # 创建md5对象 hl hashlib.md5() # Tips # 此处必须声明encode # 若写法为hl.update(str) 报错为&…

【IOS-COCOS2D-X 游戏开发之四】COCOS2DX创建ANDROID NDK新项目并编译导入ECLIPSE中正常运行!...

本站文章均为 李华明Himi 原创,转载务必在明显处注明&#xff1a; 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/645.html此篇针对较早的-x引擎讲解的&#xff0c;最新的可以参考&#xff1a; 【Cocos2d-X(2.x) 游戏开发系列之二】cocos2dx最新2…

2天后mysql_mysql 学习笔记 第二天

插入表格数据:Insert into table_name set columns_1value1,columns_2value2,对于没有赋值的列&#xff0c;将会取默认值&#xff0c;并且这个方法只能一次插入一个数据利用文本方式插入数据:Load data local infile‘径’into table table_name&#xff1b;Select 的通用形式:…

mysql查看日志命令_面对成百上千台服务器产生的日志,试试这款轻量级日志搬运神器!...

Filebeat简介Filebeat是一款轻量级日志采集器&#xff0c;可用于转发和汇总日志与文件。Filebeat内置有多种模块&#xff08;Nginx、MySQL、Redis、Elasticsearch、Logstash等&#xff09;&#xff0c;可针对常见格式的日志大大简化收集、解析和可视化过程&#xff0c;只需一条…

css 百分比 怎么固定正方形_css样式写出三角形,宽高自适应的正方形,扇形!...

闲来无事练习一下常见的css样式,希望大家能指点一二&#xff01;1用css实现一个三角形&#xff01;原理用border属性<!实现它的原理那就要弄明白border属性&#xff0c;border是一个复合属性border-width 指定边框的宽度border-style 指定边框的样式border-color 指定边框的…

用lsb_release -a 查看linux版本

1、要通过yum 安装上这个命令的软件包 yum -y install redhat-lsb 2、lsb_release -a 查看linux版本信息

linux内核_Linux内核编程风格简介

01不同的语言风格当今世界上一共有5000多种语言。不同的国家、民族和地区&#xff0c;说着不同的语言。每个民族不一定有自己的文字&#xff0c;但一般都会有自己的语言。即使是同一种语言&#xff0c;在不同的时代、不同的地区和群体&#xff0c;说话的方式和语言风格也各不相…