https://nanti.jisuanke.com/t/4

 #include <bits/stdc++.h>
using namespace std;
const int N=6e5+,base =;
typedef unsigned long long ull;
char str[N];
ull hl[N],hr[N],p[N]; int mark[N][]; ull get(ull h[],int l,int r)
{
return h[r]-h[l-]*p[r-l+];
} int k=;
long long getval(int l,int r)
{
if(l==r&&str[r]=='z'+)
return ;
long long sum=;
if(str[l]=='z'+)
l++;
for(int i=;i<=;++i)
{
int temp=(mark[r][i]-l+)/;
if(temp<)
continue;
sum+=temp;
}
return sum;
}
int main()
{ cin>>(str+);
int n=strlen(str+); for(int i=n*;i>;i-=)//重点i-=2 模拟kmp添加一个字符
{
str[i]=str[i/];
str[i-]='z'+;
//中间插一个不需要的数
} n=*n;
p[]=;
for(int i=;i<=n;++i)
{
for(int j=;j<=;++j)
{
mark[i][j]=mark[i-][j];
if(str[i]!='z'+)
mark[i][str[i]-'a'+]=i;
}
}
for(int i=,j=n;i<=n;i++,j--)
{
hl[i]=hl[i-]*base+str[i]-'a'+;//正序的哈希值 ->
hr[i]=hr[i-]*base+str[j]-'a'+;//逆序的哈希值 -> 这个是必要的
p[i]=p[i-]*base;
} long long ans=;
for(int i=;i<=n;i++)//枚举每一个字符作为中点
{
int l=,r=min(i-,n-i);
while(l<r)
{
int mid=l+r+>>;//半径长度 //if(get(hl,i-mid,i-1) != get(hl,i+1,i+mid) )
//判读的确是左右区间的判断 但是 值却都是->方向的
//所以这个就是必须要有逆序的原因 if(get(hl,i-mid,i-) !=get(hr,n-(i+mid)+,n-(i+)+))
{
//如果不符合 肯定是缩小半径
r=mid-;
}
else l=mid;
}
ans+=getval(i-l,i);
}
printf("%lld\n",ans);
return ;
}

1389

解:

字符串hash二分跑回文串。

最新文章

  1. ASP.NET Web API 接口执行时间监控
  2. Android Log Tag含义
  3. win10下iis部署asp.net core rtm
  4. ACM/ICPC 之 双向链表_构造列表-模拟祖玛 (TSH OJ-Zuma(祖玛))
  5. linx 实用操作命令一
  6. linux系统进程的内存布局
  7. 下载youku视频(python3)
  8. 03C#基础(2)
  9. 汇编语言中PTR的含义(转载)
  10. jQuery基础应用
  11. Python之Metaclass详解,Python之元类
  12. MySQL8.0 原子DDL
  13. EF 6.x和EF Core实现返回dynamic类型
  14. Ubuntu gitlab安装文档及邮件通知提醒配置
  15. Kotlin的参考资料
  16. 01-Java基本语法
  17. mysql 常用的几个函数
  18. PTA——时间转换
  19. C艹 指针和const的关系和注意事项(非常有意思)
  20. Vue.js图片预览插件

热门文章

  1. 理解TCP三次握手和四次挥手
  2. Django基础之cookie
  3. 【转】Codeforces Round #406 (Div. 1) B. Legacy 线段树建图&amp;&amp;最短路
  4. 2016 ACM-ICPC NEERC F. Foreign Postcards (概率DP)
  5. vue 源码解析computed
  6. Leetcode题目200.岛屿数量(BFS+DFS+并查集-中等)
  7. VIM | vim操作大全
  8. Des加密类
  9. 003-tomcat配置文件-server、tomcat-users
  10. [hibernate]save()与persist()区别