BZOJ 4259 FFT

本文介绍了一种使用快速傅立叶变换(FFT)解决特定字符串匹配问题的方法。通过对字符串进行预处理并利用FFT进行多项式乘法,可以高效地计算两个字符串之间的相似度。这种方法特别适用于需要大量计算字符串相似度的应用场景。

思路:

为什么好多字符串的题都可以用FFT啊....

我们其实是要判断$\Sigma (a[i]-b[i])^2*a[i]*b[i]==0$

那就把a串翻转过来 把 上式展开

大力做几遍FFT就好啦~

//By SiriusRen
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define double long double
const double pi=acos(-1);
const int N=666666;
int nn,mm,n,L,R[N],all;
struct Complex{
    double x,y;Complex(){}
    Complex(double X,double Y){x=X,y=Y;}
}A[N],B[N],ans[N];
Complex operator+(Complex a,Complex b){return Complex(a.x+b.x,a.y+b.y);}
Complex operator-(Complex a,Complex b){return Complex(a.x-b.x,a.y-b.y);}
Complex operator*(Complex a,Complex b){return Complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
Complex operator/(Complex a,int b){return Complex(a.x/b,a.y/b);}
void FFT(Complex *E,int f){
    for(int i=0;i<n;i++)if(i<R[i])swap(E[i],E[R[i]]);
    for(int l=1;l<n;l<<=1){
        Complex wn=Complex(cos(pi/l),f*sin(pi/l));
        for(int j=0;j<n;j+=(l<<1)){
            Complex w=Complex(1,0);
            for(int k=0;k<l;k++,w=w*wn){
                Complex x=E[j+k],y=w*E[j+k+l];
                E[j+k]=x+y,E[j+k+l]=x-y;
            }
        }
    }
    if(!~f)for(int i=0;i<n;i++)E[i]=E[i]/n;
}
char a[N],b[N];
int main(){
    scanf("%d%d%s%s",&mm,&nn,a,b);
    for(n=1;n<=mm+nn;n<<=1)L++;
    for(int i=0;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));
    reverse(a,a+mm);
    for(int i=0;i<mm;i++)if(a[i]=='*')a[i]=0;else a[i]=a[i]-'a'+1;
    for(int i=0;i<nn;i++)if(b[i]=='*')b[i]=0;else b[i]=b[i]-'a'+1;
    for(int i=0;i<mm;i++)A[i].x=a[i];
    for(int i=0;i<nn;i++)B[i].x=b[i]*b[i]*b[i];
    FFT(A,1),FFT(B,1);
    for(int i=0;i<n;i++)ans[i]=A[i]*B[i];
    for(int i=0;i<n;i++)A[i].x=A[i].y=B[i].x=B[i].y=0;
    for(int i=0;i<mm;i++)A[i].x=a[i]*a[i]*a[i];
    for(int i=0;i<nn;i++)B[i].x=b[i];
    FFT(A,1),FFT(B,1);
    for(int i=0;i<n;i++)ans[i]=ans[i]+A[i]*B[i];
    for(int i=0;i<n;i++)A[i].x=A[i].y=B[i].x=B[i].y=0;
    for(int i=0;i<mm;i++)A[i].x=a[i]*a[i];
    for(int i=0;i<nn;i++)B[i].x=b[i]*b[i];
    FFT(A,1),FFT(B,1);
    for(int i=0;i<n;i++)ans[i]=ans[i]-A[i]*B[i]-A[i]*B[i];
    FFT(ans,-1);
    for(int i=mm-1;i<nn;i++)if(fabs(ans[i].x)<1)all++;
    printf("%d\n",all);
    for(int i=mm-1;i<nn;i++)if(fabs(ans[i].x)<1)printf("%d ",i-mm+2);
}

 

转载于:https://www.cnblogs.com/SiriusRen/p/6532747.html

【EI复现】基于深度强化学习的微能源网能量管理与优化策略研究(Python代码实现)内容概要:本文围绕“基于深度强化学习的微能源网能量管理与优化策略”展开研究,重点利用深度Q网络(DQN)等深度强化学习算法对微能源网中的能量调度进行建模与优化,旨在应对可再生能源出力波动、负荷变化及运行成本等问题。文中结合Python代码实现,构建了包含光伏、储能、负荷等元素的微能源网模型,通过强化学习智能体动态决策能量分配策略,实现经济性、稳定性和能效的多重优化目标,并可能与其他优化算法进行对比分析以验证有效性。研究属于电力系统与人工智能交叉领域,具有较强的工程应用背景和学术参考价值。; 适合人群:具备一定Python编程基础和机器学习基础知识,从事电力系统、能源互联网、智能优化等相关方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①学习如何将深度强化学习应用于微能源网的能量管理;②掌握DQN等算法在实际能源系统调度中的建模与实现方法;③为相关课题研究或项目开发提供代码参考和技术思路。; 阅读建议:建议读者结合提供的Python代码进行实践操作,理解环境建模、状态空间、动作空间及奖励函数的设计逻辑,同时可扩展学习其他强化学习算法在能源系统中的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值