以前刷过的FFT

Gym - 101667H

2017-2018 ACM-ICPC, Asia Daejeon Regional Contest

#include<bits/stdc++.h>
using namespace std;
#define maxn 4000005
const double pi=acos(-1.0);
struct com
{
    double x,y;
    com(double X=0,double Y=0)
    {
        x=X,y=Y;
    }
}a[maxn],b[maxn];
com operator + (com a,com b) {return com(a.x+b.x,a.y+b.y);}
com operator - (com a,com b) {return com(a.x-b.x,a.y-b.y);}
com operator * (com a,com b) {return com(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
int S,T,n,m,L,R[maxn],ans[maxn];
long long F[maxn];
char s[maxn],t[maxn];
double f[maxn],g[maxn];
void FFT(com a[maxn],int opt)
{
    for (int i=0;i<n;++i)
        if (i<R[i]) swap(a[i],a[R[i]]);
    for (int k=1;k<n;k<<=1)
    {
        com wn=com(cos(pi/k),opt*sin(pi/k));
        for (int i=0;i<n;i+=(k<<1))
        {
            com w=com(1,0);
            for (int j=0;j<k;++j,w=w*wn)
            {
                com x=a[i+j],y=w*a[i+j+k];
                a[i+j]=x+y,a[i+j+k]=x-y;
            }
        }
    }
}
void calc(int opt)
{
    FFT(a,1);FFT(b,1);
    for (int i=0;i<=n;++i) a[i]=a[i]*b[i];
    FFT(a,-1);
    for (int i=S-1;i<T;++i)
    {
         F[i]+=(long long)(a[i].x/n+0.5)*opt;//对于每种匹配位置累计赢的次数
    }
}
int main()
{
    scanf("%d%d",&T,&S);
    scanf("%s%s",t,s);//S短,T长
    for(int i=0;i<S/2;++i) swap(s[i],s[S-i-1]);//短串逆置
    T=T+S;
    for(int i=T-S;i<T;i++)t[i]=‘B‘;
    t[T]=0;
    m=S+T-2;
    for(int i=0;i<T;i++)
    {
        if(t[i]==‘S‘)t[i]=‘R‘;
        else if(t[i]==‘R‘)t[i]=‘P‘;
        else if(t[i]==‘P‘)t[i]=‘S‘;
    }
    for (n=1;n<=m;n<<=1) ++L;
    for (int i=0;i<n;++i)
        R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));
    for (int i=0;i<T;++i) f[i]=(t[i]==‘S‘);
    for (int i=0;i<S;++i) g[i]=(s[i]==‘S‘);
    for (int i=0;i<=n;++i) a[i]=com(0,0),b[i]=com(0,0);
    for (int i=0;i<T;++i) a[i].x=f[i];
    for (int i=0;i<S;++i) b[i].x=g[i];
    calc(1);
    for (int i=0;i<T;++i) f[i]=(t[i]==‘R‘);
    for (int i=0;i<S;++i) g[i]=(s[i]==‘R‘);
    for (int i=0;i<=n;++i) a[i]=com(0,0),b[i]=com(0,0);
    for (int i=0;i<T;++i) a[i].x=f[i];
    for (int i=0;i<S;++i) b[i].x=g[i];
    calc(1);
    for (int i=0;i<T;++i) f[i]=(t[i]==‘P‘);
    for (int i=0;i<S;++i) g[i]=(s[i]==‘P‘);
    for (int i=0;i<=n;++i) a[i]=com(0,0),b[i]=com(0,0);
    for (int i=0;i<T;++i) a[i].x=f[i];
    for (int i=0;i<S;++i) b[i].x=g[i];
    calc(1);
    long long  ans=0;
    for (int i=S-1;i<T;++i)//这个范围自己考虑一下就好了
      ans=max(ans,F[i]);//所有位置取max
    printf("%lld\n",ans);
}

原文地址:https://www.cnblogs.com/BobHuang/p/9457315.html

时间: 2024-12-29 21:50:12

以前刷过的FFT的相关文章

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

11月刷题总结

这是11月的坑...现在来填... noip考跪...希望省选rp++ (11月刷了不少水题... 动态规划+递推: [BZOJ]1072: [SCOI2007]排列perm(状压dp+特殊的技巧) [BZOJ]1068: [SCOI2007]压缩(dp) [BZOJ]1088: [SCOI2005]扫雷Mine(递推) [BZOJ]1096: [ZJOI2007]仓库建设(dp+斜率优化) [BZOJ]1037: [ZJOI2008]生日聚会Party(递推+特殊的技巧) [BZOJ]1009

微信幼儿园投票刷礼物活动,你有被投票的经历吗?

朋友间的帮忙拉拉票就行,但是这件事要是到了自己身上就不是那么简单了,今天我姐的孩子参加幼儿园投票活动,让给拉拉票,自己投完了还要去群里发一圈好友发一遍,票数不够还要心甘情愿的买礼物,关键是下面买礼物的人还显示,不买还不行,当时心想这个一个孩子刷200元的礼物,50个孩子最起码也要上万啊,这生意绝了! 我小侄女的幼儿园人多,200个小盆友左右,平时她在班级表现的比较积成绩也比较优秀,经常得到老师的夸奖,最近圆里面搞了个最美宝贝评选大赛,活动浏览量接近100万人次,应该还不错:幼儿园说是别人给免费搞

大有学问的刷漆小工具

在进行装修过程中占有相当重要的一部分--刷漆,因为墙面粉刷的结果会直接影响着整个家装的质量.要做到完美粉刷墙面当然少不了我们刷漆小工具,这些工具都有哪些呢?让我们一起来看看吧. 工具之一--需用滚筒刷墙面 又称滚筒,需搭配漆盘使用的滚筒刷,由于滚面范围广,所以是最省力.省时的刷具,尤其是接上延长杆后,可轻易粉刷墙面高处或天花板,但缺点是容易产生漆料喷溅的状况,所以滚筒刷的毛不要太短,但一定要细,这样刷出来的漆膜才会手感细腻. 滚筒刷分长毛,中毛.短毛三种,其表现为滚筒刷毛的长短,而不是滚筒本身的

防水刷漆小窍门

我们都知道墙面涂料的选择是家装中很重要的环节,只要选择一款好的墙面涂料进行刷漆,对于顺利进行过程有着不容忽视的作用. 1.墙面处理 一般装修墙面时首先要把普通基面处理平整,对于比较疏松的底材必须进行界面处理.预制板.板缝需专业密封处理后再进行施工.墙面比较大的孔洞以及裂缝应先用砂浆修补再用油漆处理.对这些小细节装修中万万不可忽视,而夏季装修更要关注混凝土的含水量,防止出现后期墙面气泡的现象. 2.底材处理 墙面基面处理完后,下面就是处理底材了.涂料均匀涂刷至底材,重新至少2次或多次,防水层厚度大

XJTUOJ wmq的A&#215;B Problem FFT

wmq的A×B Problem 发布时间: 2017年4月9日 17:06   最后更新: 2017年4月9日 17:07   时间限制: 3000ms   内存限制: 512M 描述 这是一个非常简单的问题. wmq如今开始学习乘法了!他为了训练自己的乘法计算能力,写出了n个整数,并且对每两个数a,b都求出了它们的乘积a×b.现在他想知道,在求出的n(n−1)2个乘积中,除以给定的质数m余数为k(0≤k<m)的有多少个. 输入 第一行为测试数据的组数. 对于每组测试数据,第一行为2个正整数n,

微信运动记步原理,及刷步数方法大揭密

随着"微信运动"功能的开启,朋友圈里燃起了每天刷步的热情,每天为了争夺运动封面第一名,不惜下班还在楼下多绕一圈儿再回家.那么你们都知道微信运动是如何记录我们每日行程步数的吗?这个数据到底准不准确呢?今天小编就为大家来一个大揭密. 原理: 手机内置了振动传感器或协助处理器,根据这些设备的震动频率来储存数据.简单地说,就是人在步行时重心都有一点上下移动,传感器和协作器感应到这种重心移动并进行记数. 设备: iPhone 5S/6/6 Plus三款苹果手机因为自带M7/M8协处理器,无需任何

对AM信号FFT的matlab仿真

普通调幅波AM的频谱,大信号包络检波频谱分析 u(t)=Ucm(1+macos ?t)cos ?ct ma称为调幅系数 它的频谱由载波,上下边频组成 , 包络检波中二极管截去负半周再用电容低通滤波,可以得到基带信号,那么,截去负半周后的AM信号必定包含基带信号的频谱.我们可以通过matlab来验证. %已知基带信号为1hz,载波为64hz,调制系数ma=0.3,采样频率1024hz,FFT变换区间N为2048 clear; fs=1024; f=1; %1hz基带信号 fc=64; %64hz载

用js刷题的一些坑

leecode可以用js刷题了,我大js越来越被认可了是吧.但是刷题中会因为忽略js的一些特性掉入坑里.我这里总结一下我掉过的坑. 坑1:js中数组对象是引用对象 js中除了object还有数组对象也是引用对象,这点常常被忽视,所以在递归的时候传递数组要用arr.slice(0)这样复制一个一样的新数组,不然会出现你传入的数组会被同级的递归改变,结果就不对了. 所以只要数组复制的地方最好都要这么写,除非你真的想引用.而且注意是slice不是splice这两个方法差别很大,你如果用splice(0