loj2073 「JSOI2016」扭动的回文串
ref
主要是要理解“撑到“最长这个概念
(为啥我的代码这么长QAQ
#include <iostream>
#include <cstdio>
using namespace std;
typedef unsigned long long ull;
int n, pa[200005], pb[200005], ans;
ull bse1[200005], bse2[200005], hsa1[200005], hsa2[200005], hsb1[200005];
ull hsb2[200005];
const int mod1=19260817, mod2=1e9+7;
char sa[200005], sb[200005];
bool iseq(int a, int b, int c, int d){
	if(a>b)	return true;
	ull sa1=0, sb1=0;
	if(a)
		sa1 = hsa1[a-1] * bse1[b-a+1] % mod1;
	sa1 = (hsa1[b] - sa1 + mod1) % mod1;
	if(d!=n-1)
		sb1 = hsb1[d+1] * bse1[d-c+1] % mod1;
	sb1 = (hsb1[c] - sb1 + mod1) % mod1;
	if(sa1!=sb1)	return false;
	sa1 = sb1 = 0;
	if(a)
		sa1 = hsa2[a-1] * bse2[b-a+1] % mod2;
	sa1 = (hsa2[b] - sa1 + mod2) % mod2;
	if(d!=n-1)
		sb1 = hsb2[d+1] * bse2[d-c+1] % mod2;
	sb1 = (hsb2[c] - sb1 + mod2) % mod2;
	if(sa1!=sb1)	return false;
	return true;
}
void manacher(char a[], int b[]){
	int id=0, mx=0;
	for(int i=1; i<n; i++){
		if(i<mx)	b[i] = min(b[2*id-i], mx-i);
		else	b[i] = 1;
		while(a[i-b[i]]==a[i+b[i]])	b[i]++;
		if(mx<i+b[i])	mx = i + b[i], id = i;
		ans = max(ans, b[i]);
	}
}
int main(){
	cin>>n;
	scanf("%s", sa);
	scanf("%s", sb);
	for(int i=n; i>=0; i--){
		sa[2*i+1] = '#';
		sa[2*i+2] = sa[i];
	}
	for(int i=n; i>=0; i--){
		sb[2*i+1] = '#';
		sb[2*i+2] = sb[i];
	}
	sa[0] = sb[0] = '$';
	n = 2 * (n + 1);
	bse1[0] = bse2[0] = 1;
	for(int i=1; i<n; i++){
		bse1[i] = bse1[i-1] * 131 % mod1;
		bse2[i] = bse2[i-1] * 131 % mod2;
	}
	ull ff=0;
	for(int i=0; i<n; i++){
		ff = (ff * 131 % mod1 + sa[i]) % mod1;
		hsa1[i] = ff;
	}
	ff = 0;
	for(int i=0; i<n; i++){
		ff = (ff * 131 % mod2 + sa[i]) % mod2;
		hsa2[i] = ff;
	}
	ff = 0;
	for(int i=n-1; i>=0; i--){
		ff = (ff * 131 % mod1 + sb[i]) % mod1;
		hsb1[i] = ff;
	}
	ff = 0;
	for(int i=n-1; i>=0; i--){
		ff = (ff * 131 % mod2 + sb[i]) % mod2;
		hsb2[i] = ff;
	}
	manacher(sa, pa);
	manacher(sb, pb);
	ans--;
	for(int i=1; i<n; i++){
		int pos1=i-pa[i], pos2=i+pa[i]-2;
		int l=0, r=min(pos1, n-pos2), mid, re;
		while(l<=r){
			mid = (l + r) >> 1;
			if(iseq(pos1-mid+1, pos1, pos2, pos2+mid-1))
				re = mid, l = mid + 1;
			else	r = mid - 1;
		}
		ans = max(ans, pa[i]+re-1);
	}
	for(int i=1; i<n; i++){
		int pos1=i-pb[i]+2, pos2=i+pb[i];
		int l=0, r=min(pos1, n-pos2), mid, re;
		while(l<=r){
			mid = (l + r) >> 1;
			if(iseq(pos1-mid+1, pos1, pos2, pos2+mid-1))
				re = mid, l = mid + 1;
			else	r = mid - 1;
		}
		ans = max(ans, pb[i]+re-1);
	}
	cout<<ans<<endl;
	return 0;
}
loj2073 「JSOI2016」扭动的回文串的更多相关文章
- 【LOJ】#2073. 「JSOI2016」扭动的回文串
		题解 就是一个回文串拼上左右两端 类似二分找lcp这么做 可以直接用哈希找回文串 注意要找A串前半部分,B串找后半部分 代码 #include <bits/stdc++.h> #defin ... 
- 【BZOJ4755】 [Jsoi2016]扭动的回文串
		BZOJ4755 [Jsoi2016]扭动的回文串 Solution 考虑对于他给出的 A中的一个回文串: B中的一个回文串: 或者某一个回文的扭动字符串S(i,j,k) 这样子几个限制,我们1,2就 ... 
- [BZOJ]4755: [Jsoi2016]扭动的回文串
		Time Limit: 10 Sec Memory Limit: 512 MB Description JYY有两个长度均为N的字符串A和B. 一个"扭动字符串S(i,j,k)由A中的第i ... 
- [bzoj4755][Jsoi2016]扭动的回文串
		来自FallDream的博客,未经允许,请勿转载,谢谢. JYY有两个长度均为N的字符串A和B. 一个“扭动字符串S(i,j,k)由A中的第i个字符到第j个字符组成的子串与B中的第j个字符到第k个字符 ... 
- 【题解】Luogu P4324 [JSOI2016]扭动的回文串
		原题传送门 这题实际挺水的 先对两个字符串分别跑马拉车 就能求出1.2类扭动回文串最大的长度 考虑第三类的扭动回文串\(S(i,j,k)\),一定可以表示为\(A(i,l)+A(l+1,j)+B(j, ... 
- [JSOI2016]扭动的回文串
		题目 非常板子了 看到求什么最长的回文,我们就想到枚举回文中心的方法 首先对于这个回文串只包含在一个串内的情况,我们随便一搞就可以了,大概\(Manacher\)一下就没有了 对于那种扭动的回文串,我 ... 
- BZOJ4755: [JSOI2016]扭动的回文串——题解
		https://www.lydsy.com/JudgeOnline/problem.php?id=4755 JYY有两个长度均为N的字符串A和B. 一个“扭动字符串S(i,j,k)由A中的第i个字符到 ... 
- 【BZOJ4755】扭动的回文串(Manacher,哈希)
		[BZOJ4755]扭动的回文串(Manacher,哈希) 题面 BZOJ 题解 不要真的以为看见了回文串就是\(PAM,Manacher\)一类就可以过. 这题显然不行啊. 我们主要考虑如何解决跨串 ... 
- 非确定性有穷状态决策自动机练习题Vol.1  A.扭动的回文串
		非确定性有穷状态决策自动机练习题Vol.1 A.扭动的回文串 题目描述 \(JYY\)有两个长度均为\(N\)的字符串\(A\)和\(B\). 一个"扭动字符串\(S(i,j,k)\)由\( ... 
随机推荐
- base、self标签
			以新的窗口打开页面 self在自己的窗口打开 
- <Android 基础(二)> BroadcastReceiver
			介绍 BroadcastReceiver:广播接收者,很形象,广播发送,类比生活中的广播,有能力听得到的都可以介绍到这个信息,然后在大脑中反映.对应到Android中就是SendBroadcast和o ... 
- maven+jenkins发布环境
			安装java省略,下面是环境变量 export JAVA_HOME=/usr/java/jdk1.8.0_65/ export PATH=$JAVA_HOME/bin:$PATH export CLA ... 
- LeetCode  Count and Say 数数字
			class Solution { public: string countAndSay(int n) { ) "; "; int i,t,count; char c='*'; ;i ... 
- 【洛谷1486】[NOI2004] 郁闷的出纳员(Splay的小运用)
			点此看题面 大致题意: 你是一个公司的出纳员,现在有\(n\)个操作,操作有4种:新来一个员工.增加全体员工工资.减少全体员工工资.查询第\(k\)多的工资.若一个员工的工资在某一时刻低于合同上的工资 ... 
- opencv与灰度图
			https://blog.csdn.net/qq_32211827/article/details/56854985 首先,灰度图可以是一个通道存成图片,也可以是3个通道存成图片,3个通道存成图片,其 ... 
- 用fast rcnn绘制loss曲线遇到的问题
			运行fast rcnn的train,会进入ipython,要先exit退出才能继续运行程序 绘制图像时,用了命令: ./tools/train_net.py --gpu 0 --solver mode ... 
- python_78_软件目录结构规范
			一定要看http://www.cnblogs.com/alex3714/articles/5765046.html #print(__file__)#打印的是文件的相对路径 import os pri ... 
- 利用Theano理解深度学习——Multilayer Perceptron
			一.多层感知机MLP 1.MLP概述 对于含有单个隐含层的多层感知机(single-hidden-layer Multi-Layer Perceptron, MLP),可以将其看成是一个特殊的Logi ... 
- 基础I/O
			基础IO: c库文件IO操作接口:(详细查看c语言中的文件操作函数总结:https://www.cnblogs.com/cuckoo-/p/10560640.html) fopen 打开文件 fclo ... 
