ZZULI 1876: 蛤玮的项链 Hash + 二分
Time Limit: 6 Sec Memory Limit: 128 MB
Submit: 153 Solved: 11
Description
Input
Output
Sample Input
Sample Output
HINT
思路:(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 + 二分的更多相关文章
- NBOJv2 Problem 1009 蛤玮的魔法(二分)
Problem 1009: 蛤玮的魔法 Time Limits: 1000 MS Memory Limits: 65536 KB 64-bit interger IO format: %ll ...
- 线段树区间覆盖 蛤玮打扫教室(zzuli 1877)
http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1877 Description 现在知道一共有n个机房,算上蛤玮一共有m个队员,教练做了m个签,每 ...
- 【BZOJ】1014: [JSOI2008]火星人prefix(splay+hash+二分+lcp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1014 题意:支持插入一个字符.修改一个字符,查询lcp.(总长度<=100000, 操作< ...
- NBOJv2 1004 蛤玮打扫教室(线段树区间更新区间最值查询)
Problem 1004: 蛤玮打扫教室 Time Limits: 1000 MS Memory Limits: 65536 KB 64-bit interger IO format: %l ...
- LOJ#6387 「THUPC2018」绿绿与串串 / String (Manacher || hash+二分)
题目描述 绿绿和 Yazid 是好朋友.他们在一起做串串游戏. 我们定义翻转的操作:把一个串以最后一个字符作对称轴进行翻转复制.形式化地描述就是,如果他翻转的串为 RRR,那么他会将前 ∣R∣−1个字 ...
- POJ 1743 Musical Theme (字符串HASH+二分)
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15900 Accepted: 5494 De ...
- Codeforces 1090J $kmp+hash+$二分
题意 给出两个字符串\(s\)和\(t\),设\(S\)为\(s\)的任意一个非空前缀,\(T\)为\(t\)的任意一个非空前缀,问\(S+T\)有多少种不同的可能. Solution 看了一圈,感觉 ...
- bzoj1014: [JSOI2008]火星人prefix(splay+hash+二分)
题目大意:一个字符串三个操作:①求两个后缀的LCP②插入一个字符③修改一个字符. 前几天刚学了hash+二分求lcp,就看到这题. 原来splay还能这么用?!原来splay模板这么好写?我以前写的s ...
- bnuoj 34990(后缀数组 或 hash+二分)
后缀数组倍增算法超时,听说用3DC可以勉强过,不愿写了,直接用hash+二分求出log(n)的时间查询两个字符串之间的任意两个位置的最长前缀. 我自己在想hash的时候一直在考虑hash成数值时MOD ...
随机推荐
- Math类
Math类:用于执行基本数学运算的方法 方法: public static int abs(int a):绝对值 public static double ceil(double a):向上取整 ...
- 深入理解springAOP
概念:AOP(Aspect-Oriented Programming)即面向切面编程.它是对传统的OOP(面向对象)编程的一种补充,在OOP中往往一个对象有什么行为我们就定义什么方法,对象与对象之间存 ...
- Yii2.0数据库查询的一些简单的操作
User::find()->all(); 此方法返回所有数据: User::findOne($id); 此方法返回 主键 id=1 的一条数据(举个例子): User::find()->w ...
- TypeError: 'bool' object is not callable g.user.is_authenticated()
此问题查了stackoverflow后知道is_authenticated是一个属性而不是一个方法所以g.user.is_authenticated() 用法会报错
- 产经新闻:公交WiFi这次能扛多久
来源:16WiFi.流量咪 http://www.16wifi.com/18820/mtbd/html/1096904.html 不靠谱也许是成长的烦恼,也可能是本性使然.公交WiFi就给人一种不靠 ...
- java中的equals()方法重写
如何java中默认的equals方法跟实际不符的话,需要重写equals方法.例如: public class TestEquals { public static void main(String[ ...
- css之图片路径
关于背景图片url路径:图片和调用文件在两个不同根下的(不在同一个包(文件夹)中),要用相对路径,举例"../images/cq.gif":图片和调用文件是在一个根下的直接孩子,用 ...
- jQuery1.11源码分析(1)-----Sizzle源码概览[原创]
最近在啃jQuery1.11源码,上来就遇到Sizzle这个jQuery的大核心,虽然已经清楚了Sizzle的用途,先绕过去也没事,但明知山有虎偏向虎山行才是我们要做的. 本文面向的阅读对象:正在学习 ...
- 基于iSCSI的SQL Server 2012群集测试(一)--SQL群集安装
一.测试需求介绍与准备 公司计划服务器迁移过程计划同时上线SQL Server2012,引入SQL Server2012群集提高高可用性,需要对SQL Server2012群集技术进行研究.测试,确保 ...
- FBI阅人术——用最短的时间了解一个人
FBI阅人术--用最短的时间了解一个人 和陌生人第一次见面时,要如何在一开始谈话的几分钟内,了解这个人?如何和对方拉近距离?如何找到对方喜爱的话题?如何让对方愿意开口? 这都得依靠细心而入微的观察力, ...