「Luogu P1210」回文检测 解题报告
题面
这是一道诡异的黄题
居然让你求一串吧啦吧啦的东西中 字母(大小写)最长的回文串的长度,还要输出完整的串 吐血
思路:
保持淡定,我们啥都不会,就会Manacher,那就用Manacher大法!
1、把字符串处理成只有字母(去皮)
2、把字符串中插入#
号(掺假)
3、Manacher跑一跑最长回文串长度(市场检查)
4、求出最长长度后再重新代入原来的字符串(打回原形!妖孽!)
然后,就完了~
就是去皮
的时候,顺便记录一下字符的位置,这样重新代入时就比较方便
并且由于字符串有很多行,读入时就要用getchar()
,直到EOF
为止
似乎Noip2018普及T1有人因为这个WA?
Code:
#include<bits/stdc++.h>
#define M 20010
using namespace std;
struct node{
char c;
int id;
}a[M<<1];
char st[M],s[M<<1];
int l1,l2,len,ans,res;
int p[M<<1];
bool check(char c)
{
return (c>='a'&&c<='z')||(c>='A'&&c<='Z');
}
void init()
{
int i;
for(i=0;i<l1;i++)
if(check(st[i]))
{
a[l2].c=(st[i]>='a'&&st[i]<='z')? st[i]:st[i]-'A'+'a';
a[l2++].id=i;//记录编号(位置)
}
s[0]='!';
s[1]='#';
for(i=0;i<l2;i++)
{
s[i*2+2]=a[i].c;
s[i*2+3]='#';
}
len=l2*2+2;
s[len]='?';
return;
}
void manacher()//大法不解释
{
int id=0,mx=0;
for(int i=0;i<len;i++)
{
if(i<mx)
p[i]=min(p[id*2-i],mx-i);
else
p[i]=1;
while(s[i-p[i]]==s[i+p[i]])
p[i]++;
if(i+p[i]>mx)
{
id=i;
mx=i+p[i];
}
}
return;
}
void Print(int l,int r)
{
if(l&1)//由扩展后的s数组变回a数组
l=(l-3)/2;
else
l=(l-2)/2;
if(r&1)
r=(r-3)/2;
else
r=(r-2)/2;
for(int k=a[l].id;k<=a[r].id;k++)
printf("%c",st[k]);
return;
}
int main()
{
int i;
char c=getchar();//读入
while(c!=EOF)
{
st[l1++]=c;
c=getchar();
}
init();//初始化
manacher();//大法
for(i=0;i<len;i++)//求最长
ans=max(ans,p[i]);
for(i=0;i<len;i++)//求第一次出现的位置
if(p[i]==ans)
break;
ans--;
printf("%d\n",ans);
Print(i-ans+1,i+ans-1);//重新代入
return 0;
}
「Luogu P1210」回文检测 解题报告的更多相关文章
- 「Luogu P4987」回文项链 解题报告
题面 求环中的长度为k(k为奇数)且回文中心不同的回文串个数 思路: 刚学manacher算法,就送上一道模板题,此题注重对manacher算法的理解 Manacher,但是不用插入其他符号,因为k是 ...
- 「Luogu P1435」回文字串 解题报告
题面 主要大衣大意: 给定一个字符串,求至少加入多少个字符才能使字符串变成回文字符串 下面就是我一本正经的胡说八道题解 思路: 很显然,这应该是一道典型的最长公共子序列的题目 因此,主要思想就是DP ...
- 「Luogu P3866」[TJOI2009]战争游戏 解题报告
题面 好难表述啊~ 在n*m的矩阵上,有一些大兵(为0),一些空地(一个正整数),障碍物(-1),现在摧毁一些空地,使所有大兵不能走出矩阵去(代价为表示空地的整数),求最小代价 思路: 网络流最小割 ...
- 「Luogu P2015」二叉苹果树 解题报告
题面 一个二叉树,边数为n\((2<n\le 100)\),每条边有一个权值,求剪枝后剩下p\((1<p<n)\)条边,使p条边的权值和最大 还看不懂?-- 2 5 input:5 ...
- 【九度OJ】题目1192:回文字符串 解题报告
[九度OJ]题目1192:回文字符串 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1192 题目描述: 给出一个长度不超过1000的 ...
- Manacher【p1210】回文检测
题目描述--->P1210 回文检测 分析: 看到回文显然想到了manacher算法(线性求解回文串问题 如果不了解还是去敲一下板子,学习一下比较好.-->manacher 题目要求我们求 ...
- Solution -「LOJ #141」回文子串 ||「模板」双向 PAM
\(\mathcal{Description}\) Link. 给定字符串 \(s\),处理 \(q\) 次操作: 在 \(s\) 前添加字符串: 在 \(s\) 后添加字符串: 求 \(s\ ...
- leetcode 214. 最短回文串 解题报告
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: "aaa ...
- 洛谷 P4555 [国家集训队]最长双回文串 解题报告
P4555 [国家集训队]最长双回文串 题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为\(n\)的串 ...
随机推荐
- uva 10253 Series-Parallel Networks (整数划分+多重集)
UVa Online Judge 题意是计算给定数量的边通过串联并联两种方式,能组成多少种不同的网络.将它转化为一个树形结构,也就是求有多少不同构的树. 代码如下: #include <cstd ...
- 排他网关(ExclusiveGateWay)
网关(ExclusiveGateWay) 作者:邓家海2018年3月11日 00:13:25 情景:某一家公司最近在给一个单位做一个财务审批的OA.具体需求是这样的:当部门申请的金额小于一万块的时候, ...
- pip安装指定版本的应用
可以在pip后使用 == 运算符指定版本号 pip install applicationName==version
- iptables [match] 常用封包匹配参数
参数 -p, --protocol 范例 iptables -A INPUT -p tcp 说明 匹配通讯协议类型是否相符,可以使用 ! 运算符进行反向匹配,例如: -p !tcp 意思是指除 tcp ...
- Editplus配置java编译运行环境
1.进入配置环境界面 首先,从菜单"工具(Tools)"->"配置用户工具..."进入用户工具设置. 在类别里展开"工具"树形菜单-& ...
- servicemix-3.2.1 部署异常
<jbi-task xmlns="http://java.sun.com/xml/ns/jbi/management-message" version="1.0&q ...
- php框架thinkphp3.2.3 配置文件bug
bug:有前后台的项目部署阶段(DEBUG模式为false)中,修改应用配置文件后,无效,修改自定义配置文件,正常;(开发模式正常) //项目只有后台没有前台的(单独模块),直接写在模块配置中即可,不 ...
- Notice: Use of undefined constant - assumed ' '
昨天看手册的时候有两个范例,懒得写了,直接复制,测试一下,结果报Notice; 反复检查无果,最后, 手动敲了一遍,居然正常了,汗.... 总结:偷懒害人
- H5 网络状态接口
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- React MVC框架 <某某后台商品管理开源项目> 完成项目总结
**百货后台商品信息开源项目 1.利用React app脚手架 2.封装打包 buid 3.更偏向于后台程序员开发思维 4.利用的 react -redux react-router-dom ...