POJ 3974: Palindrome

题意:

最长回文子串的长度...

分析:

Manacher板子题...

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
using namespace std;
//眉眼如初,岁月如故 const int maxn=+; int cas,len,p[maxn]; char s[maxn],str[maxn]; inline void prework(void){
int i=;
for(i=;s[i];i++)
str[i*+]='#',str[(i+)*]=s[i];
len=i*+;str[]='$';str[len]=str[len+]='#';
} inline void manacher(void){
int id,mx=,ans=;
for(int i=;i<=len;i++){
p[i]=i<mx?min(mx-i,p[id*-i]):;
while(str[i+p[i]]==str[i-p[i]])
p[i]++;
if(p[i]+i>mx)
mx=p[i]+i,id=i;
if(ans<p[i]-)
ans=p[i]-;
}
printf("%d\n",ans);
} signed main(void){cas=;
while(scanf("%s",s)&&s[]!='E'){
printf("Case %d: ",++cas);
prework();manacher();
}
return ;
}//Cap ou pas cap. Pas cap.

HDU 3948: The Number of Palindromes

题意:

求原串中本质不同的子串个数...

分析:

写完发现大家都用的后缀数组...然而我不会...只能用Manacher+Hash水...

本质不同的回文串个数级别是O(n)的...所以我们可以暴力扫描回文串...我们枚举回文串的中心位置,然后判断最长回文串,如果没有出现过则判断其子串,否则直接break...

代码:

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
#define int long long
#define II int
using namespace std;
//眉眼如初,岁月如故 const II maxn=+,Mod=; int l,cas,len,p[maxn],po[maxn],Hash[maxn]; char s[maxn],str[maxn]; struct M{
int hd[Mod+],nxt[maxn],w[][maxn],cnt; inline void clear(void){
memset(hd,-,sizeof(hd));cnt=;
} inline void insert(int x,int l,int r){
w[][cnt]=l,w[][cnt]=r,nxt[cnt]=hd[x],hd[x]=cnt++;
} inline bool find(int x,int l,int r){//cout<<"find"<<endl;cout<<l<<" "<<r<<endl;
for(int i=hd[x];i!=-;i=nxt[i])
if(r-l+==w[][i]-w[][i]+){
int j;
for(j=;j<=r-l+;j++)
if(str[w[][i]+j-]!=str[w[][i]+j-])
break;
if(j==r-l+)//{
return true;//cout<<"finish find"<<endl;}
}//cout<<"finish find"<<endl;
return false;
} }mp; inline void prework(void){
int i=;l=strlen(s);
for(i=;s[i];i++)
str[i*+]='#',str[(i+)*]=s[i];
len=i*+;str[]='$';str[len]=str[len+]='#';
for(int i=;i<=len;i++){
if(str[i]>='a'&&str[i]<='z')
Hash[i]=(Hash[i-]*%Mod+str[i]-'a'+)%Mod;
else
Hash[i]=(Hash[i-]*%Mod+)%Mod;
}
} inline void manacher(void){
int id,mx=;
for(int i=;i<=len;i++){
p[i]=i<mx?min(mx-i,p[(id<<)-i]):;
while(str[p[i]+i]==str[i-p[i]])
p[i]++;
if(i+p[i]>mx)
mx=i+p[i],id=i;
}
} inline void find(void){
int ans=;
for(int i=;i<=len;i++){//cout<<i<<" "<<p[i]<<endl;
if(!mp.find((Hash[i+p[i]-]-Hash[i-]*po[p[i]]%Mod+Mod)%Mod,i,i+p[i]-)){
ans++,mp.insert((Hash[i+p[i]-]-Hash[i-]*po[p[i]]%Mod+Mod)%Mod,i,i+p[i]-);
int lala=p[i]-;
while(lala>=&&!mp.find((Hash[i+lala-]-Hash[i-]*po[lala]%Mod+Mod)%Mod,i,i+lala-))
ans++,mp.insert((Hash[i+lala-]-Hash[i-]*po[lala]%Mod+Mod)%Mod,i,i+lala-),lala-=;
}
}
printf("%lld\n",ans-);
} signed main(void){
scanf("%lld",&cas);po[]=;Hash[]=;
for(int i=;i<=;i++)
po[i]=po[i-]*%Mod;
for(int i=;i<=cas;i++){mp.clear();
scanf("%s",s);printf("Case #%lld: ",i);
prework();manacher();find();
}
return ;
}//Cap ou pas cap. Pas cap.

By NeighThorn

Manacher--雾窗寒对遥天暮,暮天遥对寒窗雾的更多相关文章

  1. Unity中雾效的开启

    原文:https://blog.csdn.net/Rhett_Yuan/article/details/54425236 1.对于雾效的开启在新版的Unity中通过界面菜单Windows->Li ...

  2. paper 100:何恺明经典去雾算法

    一:由简至美的最佳论文(作者:何恺明  视觉计算组) [视觉机器人:个人感觉学习他的经典算法固然很重要,但是他的解决问题的思路也是非常值得我们学习的] 那是2009年4月24日的早上,我收到了一封不同 ...

  3. NeHe OpenGL教程 第十六课:雾

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. 【Unity Shaders】Unity里的雾效模拟

    写在前面 熟悉Unity的都知道,Unity可以进行基本的雾效模拟.所谓雾效,就是在远离我们视角的方向上,物体看起来像被蒙上了某种颜色(通常是灰色).这种技术的实现实际上非常简单,就是根据物体距离摄像 ...

  5. OpenCV导向滤波(引导滤波)实现(Guided Filter)代码,以及使用颜色先验算法去雾

    论文下载地址:http://research.microsoft.com/en-us/um/people/jiansun/papers/GuidedFilter_ECCV10.pdf 本文主要介绍导向 ...

  6. 雾霾天出行,如何精确避开“雷区”?2016 SODA数据侠十强

    (2016年参加了上海 SODA 竞赛,进入前十,最终获得上海市的两个奖项.) ▍跟踪雾霾,仅靠零星的监测点数据怎么行? 如果雾霾短期内没有办法彻底根治,我们可以做什么,把环境污染物对人的影响尽可能降 ...

  7. 电子模块 001 --- 遥杆 JoyStick

    电子模块 001 - 遥杆 JoyStick - Ongoing - 2016年8月31日 星期三 遥杆 JoyStick 模块 今天介绍:JoyStick 电子模块. 模块名称: 双轴按键摇杆 PS ...

  8. 批处理命令——for

    [1]for命令简介 先把for循环与for命令类比一下,这样学习理解快. for 循环语句,一般格式如下: for (表达式1;表达式2;表达式3) { 循环体; } 1. 表达式1 一般为初始状态 ...

  9. windows批处理学习(for和字符串)---03

    [1]for命令简介 先把for循环与for命令类比一下,这样学习理解快. for 循环语句,一般格式如下: 1 for (表达式1;表达式2;表达式3) 2 { 3 循环体; 4 } 1. 表达式1 ...

随机推荐

  1. 大蟒蛇肚子的"风暴"

    遇到了数据库连接数不足的问题,一般情况下会预留一些会话增加的情况,但在一些特殊情况下如连接风暴(logon storm), 如果在监听中没有做rate限流,对数据库来说巨大的冲击可能会导致数据库Han ...

  2. Python基础-Python注释

    一.什么是注释.特性 1.一段文字性的描述,通过注释,可以解释和明确Python代码的功能,并记录将来要修改的地方. 2.当程序处理时,Python解释器会自动忽略,不会被当做代码进行处理 二.注释的 ...

  3. Java 数值计算精度问题

    最近刚好做到涉及金额方面的项目,不像普通in,double,floatt类型来修饰,而是用BigDecimal来修饰,就去收集下了这方面的资料,整理如下: 1.float和double只能用来做科学计 ...

  4. Apache 错误日志

    配置文件中:httpd.conf ErrorLog "/usr/local/var/log/apache2/error_log1" CustomLog "/usr/loc ...

  5. shell脚本:变量,文件判断,逻辑运算等纪要

    shell脚本中的变量定义,引用各有不同的方式,除此之外,很常用的有文件属性判断,逻辑运算,数值运算等,下面记录一下它们的属性作用 变量 shell变量的定义分为两种:一种是直接赋值定义,另一种是嵌套 ...

  6. formpanel布局的学习

    FormPanel有两种布局:form和column,form是纵向布局,column为横向布局.默认为后者.使用layout属性定义布局类型.对于一个复杂的布局表单,最重要的是正确分割,分割结果直接 ...

  7. PHP 优化

    来源:歪麦博客 https://www.awaimai.com/1050.html 1 字符串 1.1 少用正则表达式 能用PHP内部字符串操作函数的情况下,尽量用他们,不要用正则表达式, 因为其效率 ...

  8. 【php】如何配置自主域名腾讯企业邮箱

    腾讯企业邮配置 protocal ssl smtp port 465 host smtp.exmail.qq.com user email account passwd email passwd

  9. yii2 基本的增删改查

    一:添加方法 1.1 使用成员属性的方式 save $user_name = $_POST['user_name']; $password = $_POST['password']; //实例化 $u ...

  10. Redis之Hash类型操作

    接口IRedisDaoHash: package com.net.test.redis.base.dao; import com.net.test.redis.base.entity.UserPsg; ...