时间限制: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. java 抽象属性 设计_Java 抽象类与模板设计模式详解
  2. S/4HANA表现抢眼——第一季度SAP大中华区营收再现双位数增长
  3. poj3249Test for Job(记忆化搜索)
  4. 新建MVC项目与发布
  5. angularJs解决跨域问题-最简单的完美实例
  6. 两个json对象合并为一个json对象
  7. 学习python自动化测试的好处
  8. Java实现微信公众号授权登录
  9. 如何免费建立个人博客网站?
  10. 1,matlab仿真正运动学
  11. 高德地图坐标转平面坐标
  12. VirtualBox 虚拟电脑控制台错误
  13. 中软国际万人基地项目落户高新区软件新城(组图)
  14. basler恢复出厂设置_实现图像实时采集(使用BaslerSDK)-C
  15. UVA 1626括号序列DP
  16. 等级分布图的边界元素的处理
  17. 关于http请求返回code:415的原因
  18. Python 面向对象--人狗大战(代码)
  19. 洛谷B2015计算并联电阻的阻值
  20. Github-flavored Markdown 导出为 PDF

热门文章

  1. 鸣志M2伺服驱动器电机16CL错误驱动器重载
  2. 24设计模式—中介者模式(九耶-钛伦特)
  3. mysql 廖雪峰_mysql查询(廖雪峰sql教程学习摘录)
  4. 软件STM32cubeIDE下STM32F4xx使用32位定时器2(TIM2)用DMA+PWM点亮灯带WS2812-基础样例
  5. 利用微搭实现下拉框动态填充值得问题
  6. Luogu P3338 [ZJOI2014]力
  7. 爬取医药卫生知识服务系统的药品数据——超详细流程
  8. 品聚网与规模大撕不顾情面 先披露谈天记录后认栽
  9. Qrobot健康小卫士
  10. 三步教你用Node做一个微信哄女友(基友)神器,小白可上手