[bzoj3160][FFT][manacher]万径人踪灭

为什么你的SSE连接总断?深入对比EventSource与fetch-event-source的5大差异点 本文深入对比了原生EventSource与@microsoft/fetch-event-source库在SSE连接稳定性上的五大关键差异。重点剖析了后者在请求能力、连接控制、错误处理、数据解析及性能优化方面的优势,特别是其支持POST请求、自定义Header、精细化的重连策略与生命周期管理,为解决生产环境中SSE连接频繁断开的问题提供了专业方案。 阅读详情

题意

给定一个由a和b构成的串,求不连续回文子串的个数

输入

输入一个只由a和b组成的字符串

输出

输出不连续回文子串的个数

数据范围与规定

字符串长度<=100000

题解

首先先考虑回文串,很容易想到manacher,但是这里要求的是不连续的子串,How can you do it?????
设p[i]为 以i为对称轴,相等的两个字符共有多少个
例如ababa
那么p[3]=2
所以说以i为中心 回文串总个数有(2^p[i])-1这么多个
for一遍加起来再减掉manacher算出的连续回文串就好了
剩下的就是如何快速求出p数组了
按照manacher的思路,先加上分隔符
@a@b@a@b@a@(因为csdn里不能用#所以我就@了。。)
观察两个b,发现他们在原数组中位置分别为2和4
2+4=6
有点神奇哦。。好像加起来后这个下标是加了分隔符后第三个a的位置
那么可以大胆考虑,p[i]=(Σ[1<=j<=i-1]bool(str[j]==str[i-j]))+1>>1
里面是个卷积。可以fft优化
观察n的范围,10^5的数据,哇真的要用fft优化耶
这么神奇的推fft。。我%%%%

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const LL mod=1000000007;
const double PI=acos(-1.0);
const int MAXN=263000;
struct Complex
{
    double r,i;//real imag
    Complex() {}
    Complex(double _r,double _i){r=_r;i=_i;}
    friend Complex operator + (const Complex &x,const Complex &y){return Complex(x.r+y.r,x.i+y.i);}
    friend Complex operator - (const Complex &x,const Complex &y){return Complex(x.r-y.r,x.i-y.i);}
    friend Complex operator * (const Complex &x,const Complex &y){return Complex(x.r*y.r-x.i*y.i,x.r*y.i+x.i*y.r);}
}a[MAXN],b[MAXN];
int R[MAXN],L,m,p[MAXN];
LL ans,tmp[MAXN],list[MAXN];
char s[MAXN],now[MAXN];
void fft(Complex *y,int len,int on)
{
    for(int i=0;i<len;i++)if(i<R[i])swap(y[i],y[R[i]]);
    for(int i=1;i<len;i<<=1)//枚举需要合并的长度 合并后的长度就成了i*2对吧。所以无需枚举至len 
    {
        Complex wn(cos(PI/i),sin(on*PI/i));//无需乘2,因为合并后长度i*2,用到的单位复数根只有i 
        for(int j=0;j<len;j+=(i<<1))//被分成了L/(i<<1)段序列 
        {
            Complex w(1,0);//注意一点,w是在for循环执行完毕后才累乘,因为我们还有w^0对吧 
            for(int k=0;k<i;k++,w=w*wn)//枚举前半部分,后半部分加上一个i就可以了嘛 
            {
                Complex u=y[j+k];//j+k即是前半部分 
                Complex v=w*y[j+k+i];//j+k+i即是后半部分 
                y[j+k]=u+v;
                y[j+k+i]=u-v;
            }
        }
    }
    if(on==-1)for(int i=0;i<len;i++)y[i].r/=len;//IFFT 每个数都要/len 
}
int manacher()
{
    LL ss=0;
    for(int i=1;i<=m;i++)now[2*i-1]='#',now[2*i]=s[i-1];
    m=2*m+1;
    now[m]='#';
    int k=0,r=0;
    for(int i=1;i<=m;i++)
    {
        int j=k-(i-k);//i以k为中心的对称点
        if(i<=r)
        {
            if(p[j]<r-i+1)p[i]=p[j];
            else p[i]=r-i+1;
        }
        else p[i]=1;
        while(i-p[i]>=1 && i+p[i]<=m && now[i-p[i]]==now[i+p[i]])p[i]++;
        if(i+p[i]-1>r){k=i;r=i+p[i]-1;} 
        ss=(ss+p[i]/2)%mod;
    }
    return ss;
}
void gettmp()
{
    tmp[0]=1;
    for(int i=1;i<MAXN;i++)tmp[i]=(tmp[i-1]*2)%mod;
}
int main()
{
    scanf("%s",s);
    m=strlen(s);
    L=0;int len;
    for(len=1;len<=m*2;len<<=1)L++;
    for(int i=0;i<len;i++)R[i]=(R[i>>1]>>1)|(i&1)<<(L-1);
    for(int i=0;i<m;i++)if(s[i]=='a')a[i]=Complex(1,0);
    fft(a,len,1);
    for(int i=0;i<len;i++)b[i]=b[i]+(a[i]*a[i]);
    for(int i=0;i<len;i++)
    {
        if(s[i]=='b')a[i]=Complex(1,0);
        else a[i]=Complex(0,0);
    }
    fft(a,len,1);
    for(int i=0;i<len;i++)b[i]=b[i]+(a[i]*a[i]);
    fft(b,len,-1);
    LL del=manacher();
    for(int i=0;i<len;i++)list[i]=(LL)(b[i].r+0.5);
    ans=0;gettmp();
    for(int i=1;i<len;i++)ans=(ans+tmp[list[i]+1>>1]-1)%mod;
    printf("%lld\n",(ans-del+mod+1)%mod);
    return 0;
}
71.qt quick-可伸展菜单-抽屉栏示例 通用QML界面(一键换肤) 特点: 支持动态添加item、删除item、自适应界面 附带添加删除、展开等动画 同时支持qwidget、qml加载 支持number提示(比如消息数量等) 侧边抽屉栏支持动画伸展 支持换肤、拖拽、最大化等 阅读详情

相关推荐

Python读取三菱PLC数据

3、支持自定义的数据读写操作。直接调用Read方法,可以读取到原生的byte数组,然后进行组合数据。1、每次的数据交互您都可以判断是否成功,如果您不判断,如果网络断开或是异常,会影响程序的执行。Qna3E协议的ascii类 MelsecMcAsciiNet。A兼容1E协议的二进制类 MelsecA1ENet。Qna3E协议的二进制类 MelsecMcNet。2、读写操作支持单个数和数组。

weixin_46744807的博客 1998

bzoj3160: 万径人踪灭 FFT manacher

bzoj3160: 万径人踪灭 题目 分析 一道FFT神题。话说题目还真是会强行玩梗啊 首先需要进行转化。 不连续是一个假的条件。因为你可以把连续的用manacher算出来。所以总的答案就是子序列答案-manacher 然后先把序列变成回文串的形式。比如串S=abaS=abaS=aba 变成S′=xaxbxaxS′=xaxbxaxS'=xaxbxax(下标从零开始...

maxtir的博客 352

Cibersort免疫浸润 --- 详细教程

免疫浸润是指免疫细胞如淋巴细胞、浆细胞、巨噬细胞等进入到组织或器官中,并在这些组织或器官中发挥免疫功能的过程。免疫细胞的浸润可以是炎症反应的一部分,也可以是针对感染、肿瘤或其他疾病的免疫应答的一部分。免疫浸润通过调节免疫反应和炎症反应的程度和类型,起到维护机体免疫平衡和清除异常细胞或病原体的作用。在某些情况下,免疫浸润可能导致炎症反应过度,引起组织损伤,例如自身免疫性疾病。因此,免疫浸润在许多疾病的诊断和治疗中都具有重要的意义。免疫浸润可以通过组织切片染色和免疫组织化学等方法观察和分析。

ZxVSaccount的博客 9109

【BZOJ3160】万径人踪灭(FFT,Manacher)

Description click me 直接就把pdf的图片放在那里,还不方便复制样例,差评 Solution 考虑用所有的位置对称的回文子序列的方案数减去回文串的数量,那么题目就变成了两个部分: 1. 回文串的数量直接用Manacher求即可。 2. 回文子序列可以用FFT来求,分别把a、b看做1,然后做FFT求卷积即可。 感觉用FFT解决字符串问题也是个套路吧,回文串直接F...

დ♂Hany01's Blog Space♂ღ 289

Linux 使用rm -rf /*命令后,恢复系统方法

Linux 使用rm -rf /*命令后,恢复系统方法 个人学习记录 这里实验环境采用的是radhel7.1的版本: 个人认为核心就是缺失什么组件,就从别的地方复制什么组件过来,先把系统拉起来,再慢慢恢复配置 进入救援模式 1、将/dev/sda两个分区分别挂载看看,里面的内容,有内容的就是根存在的分区 2、ifconfig eno16777777 192.168.8.2 3、从另外一台一样系统的根 。用 tar打包,一个个文件夹拷贝过来 4、到坏系统,scp另外一个系统的etc.tar.gz 5

weixin_43603476的博客 1万+

实战指南 | 快速修复Adobe Acrobat 2020安装过程中的常见注册表错误

本文提供了Adobe Acrobat 2020安装过程中遇到“无法打开键”注册表错误的详细修复指南。通过安全编辑注册表,精准定位并删除残留键值,可快速解决此常见安装报错,确保软件顺利安装。同时,文章也介绍了其他安装问题的应对策略与预防措施。

weixin_29200485的博客 564

[bzoj3160]万径人踪灭_FFT_Manacher

万径人踪灭 bzoj-3160 题目大意:给定一个ab串。求所有的子序列满足:位置和字符都关于某条对称轴对称而且不连续。 注释:$1\le n\le 10^5$。 想法: 看了大爷的题解,OrzOrz。 因为对称轴可以是两个字符中间的位置,所以我们把字符串按照$Manacher$的形式倍增。 我们希望处理出一个数组$f$,$f_i$表示以$i$为对称轴的左右相等字符个数。...

dianan0938的博客 159

广工计组实验f2一位全加器

一位全加器实验

weixin_63692154的博客 2847

【BZOJ3160】 万径人踪灭(FFT,manacher)

前言 多项式真的很难♂啊qwq Solution 考虑求的是一个有间隔的回文串,相当于是: 总的答案-没有间隔的答案 考虑总的答案怎么计算?FFT卷一下就好了。 对于每一位字符,有两种取值,然后随便卷起来,卷起来就是当前这一位之前与它相同的字符个数(这一位不能是‘0’,也就是被排斥的那一位) 然后就可以轻松解决? 是的。 #include<stdio.h> #include<st...

weixin_34291004的博客 132

SigmaStudio进阶技巧:如何用ADAU1701实现60段EQ与防啸叫算法

本文深入探讨了如何在ADAU1701 DSP芯片上实现专业级音频处理系统。通过精密的资源规划与架构设计,详细讲解了构建高达60段参数均衡器(EQ)的有效方法,并集成了移频与自适应陷波双策略的智能防啸叫算法。内容涵盖从SigmaStudio工程优化、算法模块组合到系统联调实战的全流程,旨在帮助中高级开发者充分利用ADAU1701性能,打造稳定、高效的音频处理解决方案。

weixin_28256233的博客 385

Anomalib实战指南:从零开始构建自定义异常检测数据集

本文提供了一份详细的Anomalib实战指南,指导用户从零开始构建自定义异常检测数据集。文章深入解析了数据准备的核心步骤、目录结构规范,并对比了PatchCore与FastFlow等关键模型的适用场景。通过清晰的代码示例,手把手演示了环境配置、模型训练与推理评估的全流程,旨在帮助开发者快速掌握这一工业视觉异常检测利器,有效解决实际生产中的缺陷识别难题。

weixin_29054245的博客 643

【bzoj3160】万径人踪灭 FFT+manacher

首先把字符串用#间隔开 总数-连续的字符串 连续的用manacher求 总数如何求? f[i]表示以i为中心有多少对对称的字符(不包含#,但包含本身) ans=∑2^f[i]-n 原字符串的位置i对应新字符串的位置2*i f[i]=∑str[j]*str[i-j] 第一次a=1,b=0 第二次a=0,b=1 这样算出来是对称的个数,(f[i]+1)/2是对数 最后直接计算

Oxer的专栏 493

基于YOLOv8n的FPGA无PS端PL部署完整实现方案

本文提出了一种将YOLOv8n目标检测模型完整部署到FPGA纯PL端的实现方案。通过PyTorch训练和INT8量化技术,结合Vitis AI工具链,将模型转换为适合FPGA实现的硬件描述。方案详细阐述了从模型训练、量化校准到FPGA硬件设计的全流程,重点解决了无PS端部署的架构设计、资源优化和实时性保障等关键技术挑战。实验结果表明,该方案在Xilinx Virtex-690T FPGA上实现了30FPS以上的实时目标检测性能,为边缘计算场景提供了高效的硬件加速解决方案。

huanghm88的专栏 508

[bzoj3160] 万径人踪灭 [FFT+manacher]

题面 传送门 思路 首先我们明确一个想法:答案等于“位置对称的回文子序列数”-“回文子串数”,而后面的回文子串数可以通过$manacher$做出来 所以我们的问题转化为:求“位置对称的会文字序列个数” 我们考虑以字符串$S$的第$i$个字符$S_i$作为一个子序列的对称中心 那么当$S_{i-j}=S_{i+j}\left(1\leq j\leq i-1\right)$时,我们的答案就加...

162

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

[BZOJ3160] 万径人踪灭 [Manacher][FFT]

Link BZOJ - https://www.lydsy.com/JudgeOnline/problem.php?id=3160 Luogu - https://www.luogu.org/problemnew/show/P4199 上一次写马拉车的时候甚至还没有洛谷博客 当时我还是一个挂noip的sb(虽然现在也差不多 Manacher 可以解决求 最长回文子串 的问题。 BANANA 马...

最后一次修改 240

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【BZOJ3160】万径人踪灭(manacher)(FFT)

传送门 题解: 求有多少个不完全连续的回文子序列,要求字符和位置都必须关于某个对称轴对称。 考虑求出所有回文子序列个数和回文子串个数,两者答案相减即为所求。 回文子串个数直接用manacher即可。 回文子序列个 代码: #include<bits/stdc++.h> #define ll long long #define re register #define cs const...

zxyoi_dreamer的博客(不定期诈尸) 207

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【manacher+FFT】BZOJ3160-万径人踪灭

【题目大意】 在一个仅仅含有a,b的字符串里选取一个子序列,使得: 1.位置和字符都关于某条对称轴对称; 2.不能是连续的一段。 【思路】 不连续的回文串的个数=总的回文串个数-连续回文串的个数。 后者可以用manacher在O(n)时间里面求出。求的是个数不是最长串,和之前写的几道不怎么一样,注意一下。 求总的回文串个数稍微复杂一些。我们用f[i]表示以i为对称中心,两边...

dianchunhui2654的博客 125

BZOJ 3160: 万径人踪灭 FFT+快速幂+manacher

BZOJ 3160: 万径人踪灭题目传送门 【题目大意】   给定一个长度为n的01串,求有多少个回文子序列?   回文子序列是指从原串中找出任意个,使得构成一个回文串,并且位置也是沿某一对称轴对称。  假如x是对称轴,若 i 和 j 是对称且di=dj,i,j可以视为可行的一组。可行组数记为f[x]。   f[x]=∑x−1i=1[d[x−i]==d[x+i]]f[x]=\sum_{i=1

kxy的博客 337

【BZOJ3160】万径人踪灭 FFT manacher

我是真的想写字符串的题。。。 这道题除了manacher和字符串有半!毛!钱!关!系! 题目所求的数量可以由(无限制对称字符串)-(连续对称字符串)求得 其中(连续对称字符串)可以由manacher求得,问题变为求(无限制对称字符串)的数量 我们考虑d[i]表示s[a]==s[b]&&a+b==i的数的对数(ab可以相等并且ab有序),那么sum=sigma(2^( ( d[i] - 1

鲜衣怒马少年郎 760

BZOJ 3160: 万径人踪灭(FFT+快速幂+manacher)

题目传送门题解题目大意就是求一个只有’a’和’b’的字符串中不连续的回文子序列的数量。所谓的回文子序列就是说这个子序列关于某个字符或某个间隙左右对称。举个栗子:在babbab中,b_bb_b就是一个合法的子序列。字符串只有’a’和’b’,直接设为0或1卷积一下两下。 于是位置和相同的字符对们就都被我们求出来了,回文子序列就是它们组成的。怎么来的还是要引用tututu大神的证明(括号内是我的补充):

Ab.Ever 703

[BZOJ3160]万径人踪灭 FFT+manacher

所求可以转化为所有位置和字母都回文的子序列减去回文子串。后者显然可以用manacher解决。 假设字符串倍增后,关于i对称的字母对一共有f[i]对,那么以其为对称中心的回文子序列就一共有2^f[i]-1种。我们还发现f[i]=∑[s[j]==s[i-j]]{1<=j<=i-1},s为未倍增的原串。这是一个卷积的形式,可以用fft解决,分成∑[s[j]==s[i-j]==’a’]和∑[s[j]==s

DOFYPXY的博客 385

【BZOJ3160】万径人踪灭 Manacher+FFT

【BZOJ3160】万径人踪灭 Description Input Output Sample Input Sample Output HINT 题解:自己想出来1A,先撒花~(其实FFT部分挺裸的) 做这道题,第一思路很重要,显然看到这题的第一想法就是ans=总数-不合法(不要问我为什么显然)。因为向这种用补集法的题一般都会给一些很奇葩的限制条...

weixin_30563319的博客 60

[BZOJ3160]-万径人踪灭-manacher+FFT

说在前面 感觉…好名字都被库文件取完了 一开始变量名是exp,本地编译和math库冲突了,换成index本地编译过了 然后交了一发CE了,看编译信息发现又string库冲突了… = =…简直可恶 题目 BZOJ3160传送门 题目大意 给定一个字符串(长度不超过100000),请求出符合条件的子序列数 条件: 1. 该子序列是一个回文序列 2. 该序列的位置不可以

泉華子的OI足迹 419

BZOJ[3160]万径人踪灭 FFT+Manacher

传送门ber~ 答案ans=ans=ans=所有回文子串个数−−-连续的回文子串个数 现在这两个分别考虑 以iii为对称轴的对称字符个数f(i)=∑j=1i(strj==str2∗i−j)f(i)=∑j=1i(strj==str2∗i−j)f(i)=\sum \limits _{j=1}^{i} (str_j==str_{2*i-j}),那么以iii为对称轴的对称子串个数为2f(i)−12f...

谁能代表肯德基 430
上一篇: [poj1204][caioj1465][AC自动机]地图匹配
下一篇: [bzoj5042][笛卡尔树]LWD的分科岛
Rose_max
博客等级 码龄10年 97粉丝 610原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值