马拉车算法——求回文子串个数zoj4110
zoj的测评姬好能卡时间。。
求回文子串的个数:只要把p[i]/2就行了:
如果s_new[i]是‘#’,算的是没有中心的偶回文串
反之是奇回文串
/*
给定两个字符串s,t
结论:s,t不相同的第一个字符下标为l,最后一个字符下标为r
如果l==r,那么不存在解
如果l<r,那么翻转s的一个子串时,一定是将s[l]和s[r]互相翻转
反证:假设存在s[l]和s[r+k]的翻转方法,
因为s[r+k]=t[r+k]=t[l],且s[l]=t[r+k],可得s[l]=t[l],矛盾
l-k同理 所以本题只需要考虑三种情况:
1.两个串相等:求s的回文子串
2.l==r,无解
3.l<r,首先s[l,r]翻转后和t[l,r]相等,然后找以s[l,r]为中心的回文子串
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 5000006
char s[maxn],t[maxn],s_new[maxn];
int p[maxn]; int init(){
int len=strlen(s),j=;
s_new[]='$',s_new[]='#';
for(int i=;i<len;i++){
s_new[j++]=s[i];
s_new[j++]='#';
}
s_new[j]=;
return j;
}
long long manacher(){
long long res=;
int len=init(),mx=,id;
for(int i=;i<len;i++){
if(mx>i)p[i]=min(p[*id-i],mx-i);
else p[i]=;
while(s_new[i-p[i]]==s_new[i+p[i]])p[i]++;
if(mx<i+p[i])mx=i+p[i],id=i;
res+=(long long )p[i]/;
}
return res;
}
int main(){
int T;cin>>T;
while(T--){
scanf("%s%s",s,t);
int len=strlen(s),l=0x3f3f3f3f,r=;
for(int i=;i<len;i++)
if(s[i]!=t[i]){l=i;break;}
for(int i=len-;i>=;i--)
if(s[i]!=t[i]){r=i;break;} if(l==r){puts("");continue;}
if(l>r){cout<<manacher()<<endl;continue;} int flag=;
for(int i=l,j=r;i<=r;i++,j--)
if(s[i]!=t[j])flag=;
if(flag){puts("");continue;}
else {
int ans=;
while(l!= && r!=len-){
--l;++r;
if(s[l]==s[r])ans++;
else break;
}
cout<<ans<<endl;
}
}
}
马拉车算法——求回文子串个数zoj4110的更多相关文章
- 马拉车算法——求回文串起点hdu3294
#include<bits/stdc++.h> using namespace std; #define maxn 500005 int p[maxn]; ]; int start; in ...
- zoj 2744 Palindromes(计算回文子串个数的优化策略)
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2744 题目描述: A regular palindrome i ...
- hdu5340—Three Palindromes—(Manacher算法)——回文子串
Three Palindromes Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- HDU 5371(2015多校7)-Hotaru's problem(Manacher算法求回文串)
题目地址:HDU 5371 题意:给你一个具有n个元素的整数序列,问你是否存在这样一个子序列.该子序列分为三部分,第一部分与第三部分同样,第一部分与第二部分对称.假设存在求最长的符合这样的条件的序列. ...
- SPOJ STC02 - Antisymmetry(Manacher算法求回文串数)
http://www.spoj.com/problems/STC02/en/ 题意:给出一个长度为n的字符串,问其中有多少个子串s可以使得s = s按位取反+翻转. 例如样例:11001011. 10 ...
- HDU 3948 不同回文子串个数
集训队论文中有求不同子串个数的做法,就是扫一遍height数组,过程中根据height数组进行去重.对于本题也是雷同的,只是每一次不是根据与排名在上一位的LCP去重,而是与上一次统计对答案有贡献的后缀 ...
- Manacher算法求回文半径
http://wenku.baidu.com/link?url=WFI8QEEfzxng9jGCmWHoKn0JBuHNfhZ-tKTDMux34CeY8UNUwLVPeY5HA3TyoKU2XegX ...
- CF 17E Palisection 求相交回文串个数
In an English class Nick had nothing to do at all, and remembered about wonderful strings called pal ...
- [LeetCode] 647. 回文子串 ☆☆☆(最长子串、动态规划、中心扩展算法)
描述 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串. 示例 1: 输入: "abc" ...
随机推荐
- [CF 666E] Forensic Examination
Description 传送门 Solution 对 \(T[1..m]\) 建立广义后缀自动机,离线,找出代表 \(S[pl,pr]\) 的每个节点,线段树合并. Code #include < ...
- 算法-动态规划 Dynamic Programming--从菜鸟到老鸟
算法-动态规划 Dynamic Programming--从菜鸟到老鸟 版权声明:本文为博主原创文章,转载请标明出处. https://blog.csdn.net/u013309870/ar ...
- 解决springboot jar包冲突
直接导入springboot父项依赖,其它相关springboot依赖version不用写,由spring自动依赖. <parent> <groupId>org.springf ...
- java容器-Map
Map:基本思想是映射表(维护键-值对),HashMap,TreeMap,LinkedHashMap,ConcurrentHashMap等都是基于Map接口实现的map容器,他们特性不同,表现在效率, ...
- 【Sublime Text】sublime text 安装插件方法总结
#使用Package Control组件安装插件 1.安装Package Control组件 按 Ctrl+` 调出console(注:避免热键冲突,可以在界面上操作 View-show conso ...
- 二周工作总结(php方向)
前言:年后回来在忙着换工作,最终拿到了三家的offer,最后权衡去了一家实业公司做oa系统的开发,刚入职做一些技术的总结同时记录自己的技术进步 (一) 用mysql视图实现多个表之间的联查 优点:在实 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 F Fantastic Graph(贪心或有源汇上下界网络流)
https://nanti.jisuanke.com/t/31447 题意 一个二分图,左边N个点,右边M个点,中间K条边,问你是否可以删掉边使得所有点的度数在[L,R]之间 分析 最大流不太会.. ...
- Google Protocol Buffer项目无法加载解决方案
http://blog.csdn.net/suixiangzhe/article/details/52171313 今天下载Google Protocol Buffer源码研究时发现打开工程后所有项目 ...
- EF Code First一对一、一对多、多对多关联关系配置
1.EF Code First一对一关联关系 项目结构图: 实体类: Account.cs using System; using System.Collections.Generic; using ...
- 【转载】C++ STL快速入门
https://www.cnblogs.com/skyfsm/p/6934246.html