L2-008 最长对称子串(马拉车 or 技巧暴力)
题目链接
https://pintia.cn/problem-sets/994805046380707840/problems/994805067704549376
思路
法一
因为要求的是最长的对称子串,其实就是求最长回文子串,我们很容易就能和马拉车算法联系起来,由于这里数据比较水所以直接套板子就能过,如果没学过马拉车的话可以带一点技巧的暴力过去
法二
对于一个回文串,要么是奇数长度要么是偶数长度,那么我们只需要枚举中心位置以及回文半径即可,复杂度是 O(N2)O(N^2)O(N2)
法三
我们提前用字符串hash处理,然后同样是枚举回文中心以及回文半径
代码
马拉车
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define endl "\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f#define N 210005char S[N],str[N*2+5];
int len1,len2,ans,p[N*2+5];void init() {//数组初始化,即数组长度翻倍 str[0] = '$';//为了防止数组越界 str[1] = '#';for(int i = 0; i < len1; ++i){str[i * 2 + 2] = S[i];str[i * 2 + 3] = '#';}len2 = len1 * 2 + 2;str[len2] = '*';
}void manacher() {//manacher init();int id = 0,mx = 0;//mx表示的是当前计算回文串最右边字符的最大值 for(int i=0; i < len2; ++i){p[i]=mx > i?min(p[id*2-i],mx-i) : 1;//p[i]=mx>i?min(p[id*2-i],m-i):1; for(; str[i+p[i]] == str[i-p[i]]; p[i]++);//如果字符串对称则对称长度增加 if(p[i]+i > mx)//如果大于当前的最大长度则更新 mx=p[i]+i, id = i;}
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin.getline(S,N-1);len1 = strlen(S);manacher();int maxlen = 0;for(int i = 0; i < len2; ++i)maxlen = max(p[i], maxlen);cout<<maxlen-1<<endl;return 0;
}
暴力枚举
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define endl "\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3fint main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);string s;getline(cin,s);int ans,tmp,len = s.size();ans = tmp = 0;for(int i = 0;i < len; ++i) {//长度为奇数情况tmp = 1;for(int j = 1; j < len; j++) {if(i - j < 0 || i + j >= len || s[i - j] != s[i + j])break;tmp += 2;}ans = max(ans,tmp);//长度为偶数情况tmp = 0;for(int j = 1; j < len; j++) {if(i - j + 1 < 0 || i + j >= len || s[i - j + 1] != s[i + j])break;tmp += 2;}ans = max(ans,tmp);}cout<<ans<<endl;return 0;
}
L2-008 最长对称子串(马拉车 or 技巧暴力)相关推荐
- pat 团体赛练习题集 L2-008. 最长对称子串
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s&quo ...
- 7-46 最长对称子串 (25 分)
7-46 最长对称子串 (25 分) 对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是 ...
- 7-250 最长对称子串 (25 分)
7-250 最长对称子串 (25 分) 对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于 ...
- c语言:最长对称子串(3种解决方案)
c语言:最长对称子串(3种解决方案) 参考文章: (1)c语言:最长对称子串(3种解决方案) (2)https://www.cnblogs.com/McQueen1987/p/3559497.html ...
- L2-008. 最长对称子串-PAT团体程序设计天梯赛GPLT
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s&quo ...
- 【CCCC】L2-008 最长对称子串 (25分),直接枚举遍历
problem L2-008 最长对称子串 (25分) 对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT& ...
- L2-008. 最长对称子串
L2-008. 最长对称子串 对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PA ...
- 最长对称子串 作者 陈越单位 浙江大学
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一 ...
- 7-17 最长对称子串
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一 ...
- 最长对称子串(用各个字符确定对称轴进行判断)
对给定的字符串,本题要求你输出最长对称子串的长度.例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11. 输入格式: 输入在一 ...
最新文章
- 如何提高增加包含大量记录的表的主键字段的效率
- 在C#中用COM操作CAD
- 文件服务器vsftp的配置
- Android 让图片等比例缩放的三种方法
- linux 模式表达式,linux正则表达式和扩展表达式
- 编程学习记录12:Oracle数据库的一些基本操作2,表相关操作,添加约束
- 线性代数不深入,机器学习两行泪!
- xshell 上下左右键乱码和退格键失效
- flex producer java_在 Logic Pro 中选取 Flex 与跟随设置
- cocos2d-2.0-x-2.0.3 批处理文件create-android-project.bat 创建工程缺失lib解决方法
- 处理SQL Server中的重复行
- 【操作系统/OS笔记17】文件系统基本概念、文件描述符、文件系统访问、文件别名、文件系统种类
- win10 软路由_带你入门软路由 篇一:为什么需要软路由?
- php原生检测用户,php代码在线测试_php检测用户在线状态的实例代码
- global value supply chain白皮书
- 帷幄匠心 c++ qt岗位,一二三四面 2个半小时
- 至联云讲解《IPFS凭什么能让全世界投资者疯狂》
- Nginx报504 gateway timeout错误的解决方法
- ideaIU-2020.1下载
- Node.js 安装教程(Windows)