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.如此做两次,就相当于两次修改操作

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <queue>
  6. #include <map>
  7. #include <string>
  8. using namespace std;
  9. const int x = ;
  10. const int N = ;
  11. unsigned long long H1[N], H2[N], xp[N];
  12. char s[N];
  13. int n, m;
  14. void initHash() {
  15. H1[n] = H2[n] = ;
  16. int t = ;
  17. for(int i = n - ; i >= ; --i) {
  18. H2[i] = H2[i + ] * x + s[i];
  19. H1[i] = H1[i + ] * x + s[t++];
  20. }
  21. xp[] = ;
  22. for(int i = ; i <= n; ++i) xp[i] = xp[i - ] * x;
  23. }
  24. unsigned long long getHash(int i, int L, int f) {
  25. unsigned long long h;
  26. if(f == )
  27. h = H1[i] - H1[i + L] * xp[L];
  28. else
  29. h = H2[i] - H2[i + L] * xp[L];
  30. return h;
  31. }
  32. void init() {
  33. scanf("%s", s);
  34. m = strlen(s);
  35. for(int i = ; i < m; ++i) s[i + m] = s[i];
  36. n = m << ;
  37. initHash();
  38. }
  39. int get(int i) {
  40. int L = , R = i + ;
  41. while(R - L > ) {
  42. int M = (L + R) >> ;
  43. if(n - i + M <= n && i + + M <= n && getHash(n - i, M, ) == getHash(i + , M, ))
  44. L = M;
  45. else R = M;
  46. }
  47. return L;
  48. }
  49. int change(int i, int cen) {
  50. int L = , R = i + ;
  51. while(R - L > ) {
  52. int M = (L + R) >> ;
  53. if(n - i - + M <= n && * cen - i + M <= n && getHash(n - i - , M, ) == getHash( * cen - i, M, ))
  54. L = M;
  55. else R = M;
  56. }
  57. return L;
  58. }
  59. int solve() {
  60. int pos1, pos2, pos3, ls1, ls2;
  61. if(m <= ) return m;
  62. int ans = ;
  63. for(int i = ; i < n; ++i)
  64. {
  65. int x = get(i);
  66. pos1 = i - x;
  67. if(x + + i < n) pos1 -= ;
  68. ls1 = change(pos1, i);
  69. pos2 = pos1 - ls1 + ;
  70. if(pos2 == && i - pos2 + i + < n) pos3 = ;
  71. else if(pos2 == ) pos3 = pos2;
  72. else {
  73. pos3 = pos2;
  74. if(i - pos2 + i + < n) {
  75. pos2 -= ;
  76. ls2 = change(pos2, i);
  77. pos3 = pos2 - ls2 + ;
  78. }
  79. }
  80. ans = max(ans, (i - pos3) * + );
  81. }
  82. return min(m, ans);
  83. }
  84. int main() {
  85. // freopen("in", "r", stdin);
  86. int _; scanf("%d", &_);
  87. while(_ --) {
  88. init();
  89. int ans = solve();
  90. if(ans % == ) ans--;
  91. printf("%d\n", ans);
  92. }
  93. return ;
  94. }
  95.  
  96. /**************************************************************
  97. Problem: 1876
  98. User: atrp
  99. Language: C++
  100. Result: Accepted
  101. Time:2676 ms
  102. Memory:6208 kb
  103. ****************************************************************/

ZZULI 1876: 蛤玮的项链 Hash + 二分的更多相关文章

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

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

  2. 线段树区间覆盖 蛤玮打扫教室(zzuli 1877)

    http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1877 Description   现在知道一共有n个机房,算上蛤玮一共有m个队员,教练做了m个签,每 ...

  3. 【BZOJ】1014: [JSOI2008]火星人prefix(splay+hash+二分+lcp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1014 题意:支持插入一个字符.修改一个字符,查询lcp.(总长度<=100000, 操作< ...

  4. NBOJv2 1004 蛤玮打扫教室(线段树区间更新区间最值查询)

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

  5. LOJ#6387 「THUPC2018」绿绿与串串 / String (Manacher || hash+二分)

    题目描述 绿绿和 Yazid 是好朋友.他们在一起做串串游戏. 我们定义翻转的操作:把一个串以最后一个字符作对称轴进行翻转复制.形式化地描述就是,如果他翻转的串为 RRR,那么他会将前 ∣R∣−1个字 ...

  6. POJ 1743 Musical Theme (字符串HASH+二分)

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15900   Accepted: 5494 De ...

  7. Codeforces 1090J $kmp+hash+$二分

    题意 给出两个字符串\(s\)和\(t\),设\(S\)为\(s\)的任意一个非空前缀,\(T\)为\(t\)的任意一个非空前缀,问\(S+T\)有多少种不同的可能. Solution 看了一圈,感觉 ...

  8. bzoj1014: [JSOI2008]火星人prefix(splay+hash+二分)

    题目大意:一个字符串三个操作:①求两个后缀的LCP②插入一个字符③修改一个字符. 前几天刚学了hash+二分求lcp,就看到这题. 原来splay还能这么用?!原来splay模板这么好写?我以前写的s ...

  9. bnuoj 34990(后缀数组 或 hash+二分)

    后缀数组倍增算法超时,听说用3DC可以勉强过,不愿写了,直接用hash+二分求出log(n)的时间查询两个字符串之间的任意两个位置的最长前缀. 我自己在想hash的时候一直在考虑hash成数值时MOD ...

随机推荐

  1. linux配置java开发环境

    一.下载jdk java -version 查看有没有安装jdk 下载对应版本的jdk:jdk-java7u60-linux-x64.tar.gz   二.解压 cp jdk-java7u60-lin ...

  2. Win7如何删除需要管理员权限才能删除的文件夹

    在Windows 7系统运行中.往往会遇到想要删除某个文件夹时,系统提示:文件夹访问被拒绝 你需要权限来执行此操作,如何才能删除此类文件夹呢? ------------------ --------- ...

  3. nltk27_NLTK聚类分析

    http://www.pythontip.com/blog/post/10044/ Python自然语言处理(三) -- 利用NLTK进行聚类 这篇文章介绍如何利用NLTK进行聚类,和上两篇文章Pyt ...

  4. 20145204&20145212信息安全系统实验一报告

    信息安全系统实验报告 实验一 步骤 1.连接 arm 开发板 将 arm 开发板的电源线接好,使得开发板开关处于闭合状态.再分别将串口线.并口线和网线与 pc 机连接好. 2.建立超级终端 运行 wi ...

  5. C++ GC

    http://www.codeproject.com/Articles/912/A-garbage-collection-framework-for-C http://www.codeproject. ...

  6. Class PLBuildVersion is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/AssetsLibr

    网上找了一大堆,没有解决的办法 ,主要是iOS10的适配问题,info.plist里没有加对. 访问相册,我只加了 <!-- 相册 --> <key>NSPhotoLibrar ...

  7. 第三次个人作业—“K米”评测

    第一部分 调研,评测 评测 1.上手体验: 软件欢迎界面,色彩对比鲜明,前三图深色调,最后一条则充满了艳丽的色彩,让人对这个产品突然充满了期待. 软件界面加载速度慢,很多地方点击进去要等好久才能出现界 ...

  8. java基础 集合类

    java集合类主要有以下集中: List结构的集合类: ArrayList类, LinkedList类, Vector类, Stack类 Map结构的集合类: HashMap类,Hashtable类 ...

  9. error 502 in ngin php5-fpm

    unix:/var/run/php5-fpm.sock failed (11: Resource temporarily unavailable) http://stackoverflow.com/q ...

  10. MineCraft note

    客户端:http://pan.baidu.com/s/1hqgS8sshttp://pan.baidu.com/s/1mgmkduC 材质包:R3D小地图MODCraftGuide mod 内置合成表 ...