「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\)的串 ...
随机推荐
- <肖申克的救赎>观后感
肖申克的救赎主要讲述了银行家安迪在不健全的法律制度下被陷害进入了--鲨堡监狱,最后为了重见光明.追求自由,实现“自我救赎”的故事. 1.希望是件好东西,也许是世上最好的东西.好东西从来不会流逝. Ho ...
- HDU-6703-array-2019CCPC选拔赛
我TM真是一个弟弟... 题意: 给出一串1-N的数字 你每次可以把某个位置的值+1000000 或者找一个值,所有a[1]...a[r]序列的数都不能等于这个值,并且这个值>w 当时比赛觉得肯 ...
- behavior planning——11 create a cost function speed penalty
A key part of getting transitions to happen when we want them to is the design of reasonable cost ...
- H3C 用debugging ppp all命令调试PPP
- java 多线程之synchronized wait/notify解决买票问题
一.Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的st ...
- Vue2.0做的项目在IE下面打开一片空白?
解决方式:安装 "babel-polyfill" 即可. 命令:cnpm install --save-dev babel-polyfill 在入口main.js文件引入:impo ...
- Class对象的isAssignableFrom方法
isAssignableFrom 在看一个开源代码时,在加载完某个Class对象后,经常会使用 java.lang.Class#isAssignableFrom 来校验下. 之前真没有注意过Class ...
- 51nod 1380"夹克老爷的逢三抽一"(贪心+set)
传送门 •参考资料 [1]:51Nod-1380-夹克老爷的逢三抽一 •题意 从长度为 n 的数组中抽取 $\frac{n}{3}$ 个不相邻的值使得加和最大(首尾也不能同时取) •题解 贪心选择当前 ...
- H3C 其他OSPF显示命令
- P1001 A+B+C Problem
题目描述 输入三个整数 \(a,b,c\) ,计算它们的和并将结果输出. 输入格式 输入一行,三个整数 \(a,b,c\) ,每个整数之间以一个空格隔开 \((0 \le a,b,c \le 1000 ...