时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
给定一个字符串S,请统计S的所有子串中,有多少个本质不同的回文字符串?

注意如果两个位置不同的子串满足长度相同且对应字符也都相同,则认为这两个子串本质上是相同的。

输入
一个只包含小写字母的字符串S。

对于30%的数据,S长度不超过100。

对于60%的数据,S长度不超过1000。

对于100%的数据,S长度不超过800000。

输出
回文子串的数量

样例输入
abbab
样例输出
5

思路:利用manacher求出所有子串然后插入hash表统计。

#include<bits/stdc++.h>
using namespace std;
const int MAX=2e6+10;
const int Hashsize=2000003;
const unsigned long long p=131;
typedef long long ll;
typedef unsigned long long ull;
struct lenka
{int next;ull val;
}ed[MAX];
int head[MAX],cnt=0;
ull f[MAX],sum[MAX];
int ans=0;
void Insert(int x,int y)
{ull tot=sum[y]-sum[x-1]*f[y-x+1];for(int i=head[tot%Hashsize];i!=-1;i=ed[i].next){if(tot==ed[i].val)return;}ans++;ed[cnt].next=head[tot%Hashsize];ed[cnt].val=tot;head[tot%Hashsize]=cnt++;
}
char s[MAX];
int len[MAX];
int main()
{scanf("%s",s+1);int n=strlen(s+1);f[0]=1;for(int i=1;i<=n;i++){f[i]=f[i-1]*p;sum[i]=sum[i-1]*p+s[i];}memset(head,-1,sizeof head);cnt=0;int mx=0,x=0;for(int i=1;i<=n;i++){Insert(i,i);if(mx>i)len[i]=min(mx-i,len[2*x-i]);while(i+len[i]+1<=n&&s[i+len[i]+1]==s[i-len[i]-1]){Insert(i-len[i]-1,i+len[i]+1);len[i]++;}if(i+len[i]>mx){mx=i+len[i];x=i;}}mx=x=0;memset(len,0,sizeof len);memset(head,-1,sizeof head);cnt=0;for(int i=2;i<=n;i++){if(mx>i)len[i]=min(mx-i+1,len[2*x-i]);while(i+len[i]<=n&&s[i+len[i]]==s[i-len[i]-1]){Insert(i-len[i]-1,i+len[i]);len[i]++;}if(i+len[i]-1>mx){mx=i+len[i]-1;x=i;}}printf("%d\n",ans);return 0;
}

hihocoder#1602 : 本质不同的回文子串的数量(manacher+Hash)相关推荐

  1. 51NOD 1088 最长回文子串1089 最长回文子串 V2(Manacher算法)

    回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. Input 输入Str(Str的长度 <= 1000(第二题要 ...

  2. 【回文字符串】 最长回文子串O(N) Manacher算法

    原理讲的清晰:Manacher's ALGORITHM: O(n)时间求字符串的最长回文子串 注意: ①动态生命P[]和newStr数组后,不要忘记delete[] //其实这是基本的编码习惯 ②最终 ...

  3. 每天一道LeetCode-----最长回文子串/序列,从头开始的最长回文子串长度

    Longest Palindromic Substring 原题链接 Longest Palindromic Substring 意思是找到最长的回文子串,注意子串和子序列的区别 蛮力法就将每个可能的 ...

  4. manacher java_最大回文子串(Manacher算法)

    1.Manacher算法 首先说明一下,Manacher算法能够使得在O(n)的时间复杂度下找到最长的回文子串. (1).Manacher算法的概述 Manacher算法只能解决长度为奇数的字符串,所 ...

  5. hiho一下第一周 Hihocoder #1032 : 最长回文子串

    #1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...

  6. HihoCode1032 最长回文子串 manacher算法

    求最长回文子串的算法比较经典的是manacher算法 转载自这里 首先,说明一下用到的数组和其他参数的含义: (1)p[i] : 以字符串中下标为的字符为中心的回文子串半径长度: 例如:abaa字符串 ...

  7. 回文字符串—回文子串—Manacher算法

    leetcode地址:5. 最长回文子串 解答参考:动态规划.中心扩散.Manacher 算法 问题描述: 给你一个字符串 s,找到 s 中最长的回文子串.比如给定字符串s = "babad ...

  8. 怎么判断一个字符串的最长回文子串是否在头尾_LeetCode 5 迅速判断回文串的Manacher算法...

    本文始发于个人公众号: TechFlow 题意 Given a string s, find the longest palindromic substring in s. You may assum ...

  9. 怎么判断一个字符串的最长回文子串是否在头尾_回文自动机入门

    缘起 回文自动机(Palindrome auto machine PAM,有些地方称之为回文树)是回文问题的大杀器~  本文使用一道很简单的题目入门这个精巧的数据结构. hdu 2163 Palind ...

最新文章

  1. 用gameMaker做个小游戏
  2. 介绍理想工作计算机 英语作文,我的理想工作英语作文(精选5篇)
  3. jQuery.proxy debug
  4. 使用 Powershell 远程连接 windows server
  5. neditor 自定义工具栏配置
  6. HOG + SVM 实现图片分类(python3)
  7. 5 html 根据手机转动而转动_最全的全景照片拍摄方法合集,手机也能拍哦
  8. shell脚本统计httpd进程和子进程占用的CPU、内存大小,要求每隔5s统计一次
  9. stm32的串口DMA空闲中断接收不等长数据,stm32F1的usart1-DMA-IDLE收发
  10. 微信小程序父子组件传值
  11. 105套抖音快闪模板
  12. iOS开发工程师求贤贴
  13. plt.text函数用法
  14. Python可视化基础----从0学会matplotlib折线图,条形图,散点图
  15. 网格简化技术研究报告
  16. 打乱魔方软件_魔方打乱程序思路
  17. python-格式化写入xml文件
  18. 服务器声卡如何虚拟,服务器没声卡远程桌面连接怎么实现听到服务器的声音
  19. 聊聊外包团队的高效管理机制
  20. 组播IP与组播Mac的对应关系

热门文章

  1. ArcGIS多个HDF到处至一个TIF文件
  2. GPS北斗定位平台的开发——java
  3. Git提交时出现Merge branch ‘master‘ of ...之解决方法
  4. java后台过滤特殊表情_java--正则过滤表情
  5. 仿京东严选商城项目,集购物+支付+发货一体化架构项目解决方案
  6. C语言n番战--字符串(六)
  7. 我是开源社 v.2020
  8. SegmentFault 思否联合开源社共同推出中国开源先锋 30 人评选
  9. 用操作系统创新解决卡脖子问题,欧瑞博要加速全屋智能的马太效应
  10. 下载视频流M4S并合成MP4