bzoj3160(FFT+回文自动机)

题目描述

https://www.lydsy.com/JudgeOnline/problem.php?id=3160

题解

先把问题转化一下,我们要求的是非连续对称回文子序列。

ans=回文子序列数-回文子串数。

回文子串数可以用PAM或manachar求出来。

复习了一下PAM,用它求回文子串数和SAM一样,就是size[fa[i]]+=size[i],这时每一个节点代表的是所有它的后缀回文串。

然后怎么求回文子序列数。

考虑每一条对称轴,它能被谁贡献。

f[(i+j)/2]可以被i和j更新,当i和j是一种字符时。然后我们把前面的/2去掉,然后这个可以用卷积做。

最后我们发现对于一对字符会被统计两次,但是对于对称中心的字符只会被统计一次,所以我们/2时要向下取整。

坑点:PAM的size

    last=ch[last][s[i]-'a'];size[last]++;

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 100009
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const double pai=acos(-1.0);
ll ans;
int len[N],cnt,last,fail[N],ch[N][2],size[N];
int L,l,n,rev[N<<2];
char s[N];
inline int rd(){int x=0;char c=getchar();bool f=0;while(!isdigit(c)){if(c=='-')f=1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}return f?-x:x;
}
inline int power(ll x,int y){ll ans=1;while(y){if(y&1)ans=(ans*x)%mod;x=(x*x)%mod;y>>=1;}return ans;
}
struct fs{double x,y;fs(){}fs(double xx,double yy){x=xx;y=yy;}fs operator +(const fs &b)const{return fs{x+b.x,y+b.y};}fs operator -(const fs &b)const{return fs{x-b.x,y-b.y};}fs operator *(const fs &b)const{return fs{x*b.x-y*b.y,x*b.y+y*b.x};}
}a[N<<2],b[N<<2];
inline void FFT(fs *a,int tag){for(int i=0;i<l;++i)if(rev[i]>i)swap(a[i],a[rev[i]]);for(int i=1;i<l;i<<=1){fs wn(cos(pai/i),tag*sin(pai/i));for(int j=0;j<l;j+=(i<<1)){fs w(1,0);for(int k=0;k<i;++k,w=w*wn){fs x=a[j+k],y=w*a[k+i+j];a[j+k]=x+y;a[i+j+k]=x-y;}}}
}
int main(){scanf("%s",s+1);n=strlen(s+1);l=1;L=0;while(l<=(n<<1))l<<=1,++L;for(int i=0;i<l;++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<(L-1));for(int i=1;i<=n;++i)if(s[i]=='a')a[i].x=1;else b[i].x=1;FFT(a,1);FFT(b,1);for(int i=0;i<l;++i)a[i]=a[i]*a[i]+b[i]*b[i];FFT(a,-1);for(int i=0;i<l;++i)a[i].x=(int)(a[i].x/l+0.1);for(int i=0;i<l;++i)ans=(ans+power(2,ceil((double)a[i].x/2))-1)%mod;cnt=last=1;len[1]=-1;fail[0]=1;for(int i=1;i<=n;++i){while(s[i-len[last]-1]!=s[i])last=fail[last];if(!ch[last][s[i]-'a']){len[++cnt]=len[last]+2;int y=fail[last];while(s[i-len[y]-1]!=s[i])y=fail[y];fail[cnt]=ch[y][s[i]-'a'];ch[last][s[i]-'a']=cnt;}last=ch[last][s[i]-'a'];size[last]++;}for(int i=cnt;i;--i)(size[fail[i]]+=size[i])%=mod;for(int i=2;i<=cnt;++i)ans=(ans-size[i]+mod)%mod;cout<<ans;return 0;
}

转载于:https://www.cnblogs.com/ZH-comld/p/10205723.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

03:数据结构 栈、队列、链表与数组

算法其他篇 目录&#xff1a; 1.1 数据结构中的一些概念1.2 栈&#xff08;stack&#xff09;1.3 队列1.4 链表1.5 python中字典对象实现原理1.6 数组1.1 数据结构中的一些概念 返回顶部 1、数据结构是什么 1、简单来说&#xff0c;数据结果就是设计数据以何种方式存储在计…

力登:以智能化管理提升数据中心服务能力成熟度

2017年2月28日&#xff0c;由全国信息技术标准化技术委员会信息技术服务分技术委员会指导的《信息技术服务数据中心服务能力成熟度模型》发布&#xff0c;在业界首次提出“数据中心服务能力成熟度”概念&#xff0c;使得数据中心的管理真正实现了数字化和持续优化&#xff0c;是…

基于.NET 7 的 WebTransport 实现双向通信

Web Transport 简介WebTransport 是一个新的 Web API&#xff0c;使用 HTTP/3 协议来支持双向传输。它用于 Web 客户端和 HTTP/3 服务器之间的双向通信。它支持通过 不可靠的 Datagrams API 发送数据&#xff0c;也支持可靠的 Stream API 发送数据。因为 HTTP/3 使用了基于 UDP…

Django01: 安装/基础命令/设置笔记

安装 按官网版本支持&#xff0c;现在比较适合使用1.11版本。 下载安装命令 pip3 install django1.11.9 新建项目 django-admin startproject mysite 运行项目 python manage.py runserver 127.0.0.1:8000 运行相关 目录介绍 mysite/ ├── manage.py # 管理文件 └…

JavaScript校验网址

gistfile1.txt var linkUrl https://www.baidu.com if( typeof (linkUrl) ! undefined &amp;&amp; linkUrl ! ){var strRegex ^((https|http|ftp|rtsp|mms)?://) ?(([0-9a-z_!~*\().&amp;$%-]: )?[0-9a-z_!~*\().&amp;$%-])? //ftp的user (([0-9]{1,3}.)…

线上问题随笔记录数据库连接池问题

修改方法 转载于:https://www.cnblogs.com/lvgg/p/8581506.html

数据底座_体验当今计算机的未来:通过智能底座将您的Galaxy S4变成PC

数据底座Have you ever thought that Smartphones these days are so advanced they could actually replace the PC in your everyday computing life? Today, we here at HTG will review using the Galaxy S4 with the “Smart Dock Multimedia Hub” as a PC replacement.…

如何实现 WPF 代码查看器控件

如何实现 WPF 代码查看器控件CodeViewer作者&#xff1a;WPFDevelopersOrg - 驚鏵原文链接[1]&#xff1a;https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用.NET40&#xff1b;Visual Studio 2019;代码展示需要使用到AvalonEdit是基于WPF的代码显示控件&#xff0c;…

谈大数据也谈人工智能 郭为告诉你一个不一样的神州控股

毋庸置疑&#xff0c;我们深处一个数据无处不在的时代&#xff0c;也就是大数据时代。作为中国智慧城市领导者的神州数码控股有限公司&#xff08;以下简称“神州控股”&#xff09;近年来也在积极布局大数据&#xff0c;不过在神州控股董事局主席郭为看来&#xff0c;神州控股…

Django02: pycharm上配置django

1.setting导入 File-->Setting-->Project-->Project Interface 2.new project 新窗口 圖片畫錯 3.调试 点击右上角调试

vue-cli中配置sass

https://www.cnblogs.com/rainheader/p/6505366.html转载于:https://www.cnblogs.com/aidixie/p/10213997.html

php 常用函数

用到就记下来&#xff0c;持续更新......... __call(string $func_name, array args){}public方法不存在 调用此函数 通过pg_系列函数与Postgres 数据库交互 note: php 取得对象的某一共有属性&#xff0c;若不存在则 查看是否有get方法(魔术方法) 若有则取get方法的返回值&am…

dropbox_来自提示框:望远镜激光瞄准器,Dropbox桌面和Kindle剪辑转换

dropboxOnce a week we round up some great reader tips and share them with everyone; this week we’re looking at telescope laser sights, syncing your desktop with Dropbox, and converting your Kindle Clippings file. 每周一次&#xff0c;我们收集一些很棒的读者…

在 EF Core 7 中实现强类型 ID

本文主要介绍 DDD 中的强类型 ID 的概念&#xff0c;及其在 EF 7 中的实现&#xff0c;以及使用 LessCode.EFCore.StronglyTypedId 这种更简易的上手方式。背景在杨中科老师 B 站的.Net Core 视频教程[1]其中 DDD 部分讲到了强类型 ID&#xff08;Strongly-typed-id&#xff09…

如何快速打造一款高清又极速的短视频APP?

2019独角兽企业重金招聘Python工程师标准>>> 整个短视频的市场规模一直在增长&#xff0c;网络数据显示2018年已经突破100亿大关&#xff0c;在2019年预测将超过200亿。纵观行业&#xff0c;在生活资讯、美食、搞笑、游戏、美妆等领域&#xff0c;短视频流量巨大但竞…

Django03: django加入APP

使用命令在已有project创建 1.创建 在manage.py同级运行命令 python manage.py startapp app01 2.django中加入app 在settings.py里的INSTALLED_APPS加入app01.apps.App01Config, INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttype…

[面经]春季跳槽面筋总结 [2018年3月17]

春季跳槽面筋总结 人人都说金三银四&#xff0c;由于一些个人的原因&#xff0c;博主也在今年的三月份抽空面了几家公司&#xff0c;这里来总结下学习到的东西。 先简单的说下博主的情况&#xff1a; 2015年7月份毕业&#xff0c;到现在加上实习可以算三年工作经验base武汉&…

如何将Windows 10帐户还原为本地帐户(在Windows Store劫持它之后)

If your Windows 10 user account is currently a Microsoft account (by your choice or because you got, one way or another, roped into it) it’s easy to revert it back to a local account if you know where to look. Read on as we show you how. 如果您的Windows 1…

【译】Dapr 是一个“10倍好”平台 !?

译者注在正式阅读本文之前&#xff0c;我们有必要先了解下什么是“10 倍好”。10 倍好理论最早出自彼得蒂尔的《从 0 到 1》&#xff0c;他说一个新创企业&#xff0c;要想获得快速成长&#xff0c;其提供的解决方案要比现有方案好 10 倍以上&#xff0c;这个好 10 倍&#xff…

04.jQuery 基本语法笔记

jQuery是什么 jQuery是一个轻量级的、兼容多浏览器的JavaScript库。jQuery使用户能够更方便地处理HTML Document、Events、实现动画效果、方便地进行Ajax交互&#xff0c;能够极大地简化JavaScript编程。它的宗旨就是&#xff1a;“Write less, do more.“ jQuery引入到HTML …