题目大意

给你两个字符串,N,M |N|>|M|,经过转换之后,问你,连续的一段,能够匹配上的最大元素个数。
n <1e5

题目分析

题目求区间内匹配数最大。考虑区间有n^2个,暴力做显然会T,所以这里考虑,用FFT
将第二个串反置,这样我们相邻位置的匹配,可以转化为,对应位置的匹配

如下图:


此时我们发现,最大匹配数 就是 i+j的系数

因此,我们分别求R,S,P的匹配,三次FFT之后将系数加起来,求一个最大值即可

代码分析

#include <bits/stdc++.h>
using namespace std;
const int maxn = 4e6+50;
const double pi = acos(-1.0);
typedef long long ll;
struct Complex
{double x,y;Complex(double _x = 0,double _y=0){x=_x; y=_y;}Complex operator +(const Complex &b) const{return Complex(x+b.x,y+b.y);}Complex operator -(const Complex &b) const{return Complex(x-b.x,y-b.y);}Complex operator * (const  Complex&b) const{return Complex(x*b.x-y*b.y,x*b.y+y*b.x);}
}a[maxn],b[maxn];
int S,T,n,m,L,R[maxn],ans[maxn]; //S 表示A序列的长度 ,T表示B序列的长度
//n 表示 >=S+T 的2的幂次 L表示幂次 R数组是旋转数组,ans答案数组
ll F[maxn];
double f[maxn][3],g[maxn][3];// f,g数组是整数转化为实数的数组
char x[maxn],y[maxn];
void FFT(Complex a[],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){Complex wn = Complex(cos(pi/k),opt*sin(pi/k));for(int i=0;i<n;i+=(k<<1)){Complex w = Complex(1,0);for(int j=0;j<k;j++,w=w*wn){Complex 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=0;i<=n;i++) F[i] = (ll) (a[i].x/n+0.5)*opt;}
int main()
{scanf("%d%d",&S,&T);S--,T--;scanf("%s%s",x,y);for(int i=0;i<=S;i++){if(x[i]=='R') f[i][0] = 1.0;if(x[i]=='S') f[i][1] = 1.0;if(x[i]=='P') f[i][2] = 1.0;}for(int i=0;i<=T;i++){if(y[i]=='R') g[T-i][1] = 1.0;if(y[i]=='S') g[T-i][2] = 1.0;if(y[i]=='P') g[T-i][0] = 1.0;}
//  for(int i=0;i<=T;i++) scanf("%lf",&g[i]);m=T+S; L=0;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 kase=0;kase<3;kase++){for(int i=0;i<=n;i++){a[i]= Complex(1.0*f[i][kase],0.0);b[i]= Complex(1.0*g[i][kase],0.0);}calc(1);for(int i=0;i<=S+T;i++) {ans[i]+=F[i];//   printf("%lld ",F[i]);}//  printf("\n");}int allans=0;for(int i=T;i<=S+T;i++) allans= max(allans,ans[i]);printf("%d\n",allans); return 0;
} /*
12 4
PPPRRRRRRRRR
RSSS12 4
RRRRRRRRRSSS
RRRS*/

2017ACM ICPC Asia Regional-Daejeon H-Rock Paper Scissors[ FFT]相关推荐

  1. 2017 ACM ICPC Asia Regional - Daejeon

    2017 ACM ICPC Asia Regional - Daejeon Problem A Broadcast Stations 题目描述:给出一棵树,每一个点有一个辐射距离\(p_i\)(待确定 ...

  2. 2017 ACM ICPC Asia Regional - Daejeon Programming Constest

    A: Broadcast Stations 题目大意 给定一棵树,选一些节点iii,赋予P(i)" role="presentation">P(i)P(i)P(i) ...

  3. 2021年度训练联盟热身训练赛第四场 H - Rock Paper Scissors(字符串匹配,FFT)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 2021年度训练联盟热身训练赛第四场 H - Rock Paper Scissors(字符串匹配,FF ...

  4. Problem H Rock Paper Scissors,FFT

    题目 题目链接 题意 给出两段石头剪刀布的顺序SSS和T" role="presentation" style="position: relative;&quo ...

  5. 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)...

    2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...

  6. Problem 1002-2017 ACM/ICPC Asia Regional Shenyang Online

    网络赛:2017 ACM/ICPC Asia Regional Shenyang Online 题目来源:cable cable cable Problem Description: Connecti ...

  7. 2015 ACM/ICPC Asia Regional Shenyang Online题解

    以下所有AC题解程序来自"仙客传奇"团队. AC题数:7/13 ABCFGJL A. Traversal AC的C++语言程序: #include <bits/stdc++. ...

  8. 2014 ACM/ICPC Asia Regional Guangzhou Online C题Wang Xifeng's Little Plot(dfs)

    Wang Xifeng's Little Plot Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  9. The 36th ACM/ICPC Asia Regional Dalian Site 1006 Dave

    Dave Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65768/65768K (Java/Other) Total Submissi ...

  10. 【Codeforces 1426 E】Rock, Paper, Scissors,贪心!算反面

    problem E. Rock, Paper, Scissors time limit per test1 second memory limit per test256 megabytes inpu ...

最新文章

  1. php 进程 线程,php进程还是线程
  2. 详解centos7使用无线wifi连接的方法
  3. 经典C语言程序100例之三零
  4. Hacking techniques automation
  5. 最常用计算机机箱,电脑机箱的常用材质是什么?
  6. Magento教程 22:如何确认订单报表?
  7. [Ajax] Ajax的基本用法
  8. Python入门2_之列表元组
  9. webService返回自定义类型的数据处理
  10. 提升交互设计必备的28本好书
  11. 车企进军手机市场,意在智能汽车
  12. “垃圾食品”卫龙欲洗白上市,藏在“辣条一哥”背后的暴利生意经
  13. *Algs4-1.4.26-三点共线-(未解决)
  14. 米家蓝牙温湿度计2接入树莓派并通过homeassistant显示
  15. Markdown中如何插入EXCEL表格
  16. 一文看尽2020上半年阿里、腾讯、百度入选AI顶会论文
  17. 简单跑酷java代码_如何实现一个简单的跑酷游戏?(代码详解)
  18. 3288 配置声卡芯片
  19. WIN7下开机欢迎界面去掉画面下方windows 7 旗舰版
  20. BCG 全局主题样式

热门文章

  1. 谷歌浏览器自动翻译当前网页
  2. 新一代 IT 服务管理平台 DOSM,助力企业数字化转型
  3. Win10系统电脑玩地平线4闪退解决方法教学
  4. Android之APP跳转到权限设置界面适配华为、小米、vivo等
  5. 程序员面试揭秘之程序员靠什么途径去美国工作?
  6. 画中画视频怎么制作?学会这招,让你成为短视频高手!
  7. 单位强制解除与员工的劳动关系怎么办
  8. 女巫小屋的指令Java_我的世界女巫小屋详介绍 我的世界女巫小屋种子代码一览...
  9. 社区宽带繁忙是什么意思_智慧社区盈利模式分析
  10. cad计算机绘注意事项,CAD打印的基本操作和重要的注意事项