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 = ;
const int N = ;
unsigned long long H1[N], H2[N], xp[N];
char s[N];
int n, m;
void initHash() {
H1[n] = H2[n] = ;
int t = ;
for(int i = n - ; i >= ; --i) {
H2[i] = H2[i + ] * x + s[i];
H1[i] = H1[i + ] * x + s[t++];
}
xp[] = ;
for(int i = ; i <= n; ++i) xp[i] = xp[i - ] * x;
}
unsigned long long getHash(int i, int L, int f) {
unsigned long long h;
if(f == )
h = H1[i] - H1[i + L] * xp[L];
else
h = H2[i] - H2[i + L] * xp[L];
return h;
}
void init() {
scanf("%s", s);
m = strlen(s);
for(int i = ; i < m; ++i) s[i + m] = s[i];
n = m << ;
initHash();
}
int get(int i) {
int L = , R = i + ;
while(R - L > ) {
int M = (L + R) >> ;
if(n - i + M <= n && i + + M <= n && getHash(n - i, M, ) == getHash(i + , M, ))
L = M;
else R = M;
}
return L;
}
int change(int i, int cen) {
int L = , R = i + ;
while(R - L > ) {
int M = (L + R) >> ;
if(n - i - + M <= n && * cen - i + M <= n && getHash(n - i - , M, ) == getHash( * cen - i, M, ))
L = M;
else R = M;
}
return L;
}
int solve() {
int pos1, pos2, pos3, ls1, ls2;
if(m <= ) return m;
int ans = ;
for(int i = ; i < n; ++i)
{
int x = get(i);
pos1 = i - x;
if(x + + i < n) pos1 -= ;
ls1 = change(pos1, i);
pos2 = pos1 - ls1 + ;
if(pos2 == && i - pos2 + i + < n) pos3 = ;
else if(pos2 == ) pos3 = pos2;
else {
pos3 = pos2;
if(i - pos2 + i + < n) {
pos2 -= ;
ls2 = change(pos2, i);
pos3 = pos2 - ls2 + ;
}
}
ans = max(ans, (i - pos3) * + );
}
return min(m, ans);
}
int main() {
// freopen("in", "r", stdin);
int _; scanf("%d", &_);
while(_ --) {
init();
int ans = solve();
if(ans % == ) ans--;
printf("%d\n", ans);
}
return ;
} /**************************************************************
Problem: 1876
User: atrp
Language: C++
Result: Accepted
Time:2676 ms
Memory:6208 kb
****************************************************************/

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. 在WildFly中运行多个standalone模式的实例

      WildFly作为一款优秀的EJB容器,其前身为JBoss AS.JBoss作为一款开源的应用服务器,被广泛的应用在各种项目当中.假设我们现在有这样一个项目,他是以standalone的模式运行在 ...

  2. CodeForces 165E Compatible Numbers(位运算 + 好题)

    wo integers x and y are compatible, if the result of their bitwise "AND" equals zero, that ...

  3. linux 命令行 光标移动技巧

    linux 命令行 光标移动技巧 看一个真正的专家操作命令行绝对是一种很好的体验-光标在单词之间来回穿梭,命令行不同的滚动.在这里强烈建立适应GUI节目的开发者尝试一下在提示符下面工作.但是事情也不是 ...

  4. “基础提供程序在Open上失败”

    本来布置在IP为[x.x.x.x]的WCF服务好好的,但是今天突然就有问题了,一调用报错"基础提供程序在Open上失败"... 服务器上的有问题,先试试本地的服务能不能用吧,连的都 ...

  5. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  6. java基础 泛型

    泛型的存在,是为了使用不确定的类型. 为什么有泛型? 1. 为了提高安全 2. 提高代码的重用率 (自动 装箱,拆箱功能) 一切好处看代码: package test1; import java.la ...

  7. linux mingling

    grep 文本搜索工具 -i 忽略大小写 -v 不显示匹配行 -c 显示符合条件的行数值 文本搜索支持正则表达式 1 2 3 cat /etc/passwd | grep root // 显示包含ro ...

  8. Python:设计模式介绍--单例模式

    单例模式 1.单例是只有一个实例2.通过静态字段+静态字段伪造出一个单例效果3.什么时候用:当所有实例中封装的数据相同时,创建单例模式(eg:连接池) 用单例模式创建连接池: class CP: __ ...

  9. html中表格元素的相关总结

    表格元素相关总结: 1.在CSS中,内部表元素(如td.tr.col等)生成矩形框,这些矩形框包含内容.内边距和边框,但没有外边距,因此如果定义外边距,浏览器将忽略该定义:对于table元素,外边距有 ...

  10. How to install OpenBazaar Server in CentOS7

    helps from: https://github.com/OpenBazaar/OpenBazaar-Server http://stackoverflow.com/questions/24917 ...