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

ZZULI 1876: 蛤玮的项链 Hash + 二分相关推荐

  1. NBOJv2 Problem 1009 蛤玮的魔法(二分)

    Problem 1009: 蛤玮的魔法 Time Limits:  1000 MS   Memory Limits:  65536 KB 64-bit interger IO format:  %ll ...

  2. “玲珑杯”郑州轻工业学院第八届ACM程序设计大赛Problem G: 蛤玮点菜

    Problem G: 蛤玮点菜 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 320  Solved: 31 SubmitWeb Board Desc ...

  3. 蛤玮打扫教室(区间覆盖)

    1877: 蛤玮打扫教室 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 332  Solved: 71 SubmitStatusWeb Board D ...

  4. bzoj 1014: [JSOI2008]火星人prefix(splay维护区间+Hash+二分)

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 7588  Solved: 2429 [Submi ...

  5. Problem 1004: 蛤玮打扫教室(区间覆盖端点记录)

    Problem 1004: 蛤玮打扫教室 Time Limits:  1000 MS   Memory Limits:  65536 KB 64-bit interger IO format:  %l ...

  6. 后缀数组 + Hash + 二分 or Hash + 二分 + 双指针 求 LCP ---- 2017icpc 青岛 J Suffix (假题!!)

    题目链接 题目大意: 就是给你n个串每个串取一个后缀,要求把串拼起来要求字典序最小!! sum_length_of_n≤5e5sum\_length\_of\_n\leq 5e5sum_length_ ...

  7. 1402 后缀数组 (hash+二分)

    描述 后缀数组 (SA) 是一种重要的数据结构,通常使用倍增或者DC3算法实现,这超出了我们的讨论范围.在本题中,我们希望使用快排.Hash与二分实现一个简单的 O(n log^2⁡n ) 的后缀数组 ...

  8. codechef INSQ15_A(hash+二分)

    思路:首先计算字符串s的所有后缀的hash值,然后根据p分离的两个字符串的最长公共子串,使用二分查找.具体代码参考: https://github.com/wuli2496/OJ/blob/maste ...

  9. hdu 4495(hash+二分+dp)

    题意:求一个n*m的矩阵里面的最大的一个对称等腰直角三角形,三角形的腰必须平行于矩阵的边,n,m<=500. 解题思路:腰平行于矩阵的边,其实也就是做四个方向,首先找到每一个点的最长腰f[i][ ...

最新文章

  1. Spark详解(五):Spark作业执行原理
  2. java 反射 new区别_JAVA的newInstance()和new的区别(JAVA反射机制,通过类名来获取该类的实例化对象)...
  3. python重点知识 钻石_python——子类对象如何访问父类的同名方法
  4. 牛客题霸 [ 孩子们的游戏] C++题解/答案
  5. java冒泡遍历对象_Java经典排序算法(冒泡、选择、插入)
  6. 对美食评语进行情感分析
  7. 人之间的尊重是相互的_人与人之间要学会相互尊重
  8. Windows Debugging之六
  9. MYSQL 开发技巧
  10. Win10PE网络版.iso UEFI、BIOS双启动
  11. 1288元,苍井空“空系列”内衣微博开卖
  12. 破解虚拟机ESXi服务器密码,esxi虚机Windows server 2012忘记密码解决办法
  13. 自动识别查找特定的串口号 比如设备管理器中Modem属性里的串口 按这个方法可以获取设备管理器任意信息。C++
  14. 【GNN报告】腾讯AI lab 徐挺洋:图生成模型及其在分子生成中的应用
  15. zcmu1064: 计算旅途时间
  16. 微服务架构设计实践系列之九:应用架构
  17. f12获取网页文本_F12 - 开发者工具详解
  18. Jquary全屏滚动插件fullpage.js的使用
  19. java流控_t-io小教程:tio-http内置的流控功能
  20. 千年古茶树生嫩芽 散茶香

热门文章

  1. kafka服务器死机消息,当kafka集群其中一台宕机后,会怎么样?
  2. c汇编语言例题,汇编语言例题分析.doc
  3. 妖帝q群机器人_有关酷Q 晨风机器人,契约 qqlite qqlight ,mypc等QQ机器人关停一事的一点想法...
  4. python生成固定长度随机数_python日记——random模块
  5. echarts柱图根据值显示不同颜色_视频 | Origin画3D柱图,这篇讲透了!
  6. twisted mysql_在Twisted下用MySQLadbapi获取自增id
  7. oracle查询表nextval,Oracle Database 建立与查询 Sequence
  8. java 圆 继承_java 类的继承(转)
  9. 事业单位综合应用能力计算机,最新事业单位统考-综合应用能力C类梳理精华.pdf...
  10. layer调用父页面方法_Ruby for SketchUp之图层【Layer】