2017ACM ICPC Asia Regional-Daejeon H-Rock Paper Scissors[ FFT]
题目大意
给你两个字符串,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]相关推荐
- 2017 ACM ICPC Asia Regional - Daejeon
2017 ACM ICPC Asia Regional - Daejeon Problem A Broadcast Stations 题目描述:给出一棵树,每一个点有一个辐射距离\(p_i\)(待确定 ...
- 2017 ACM ICPC Asia Regional - Daejeon Programming Constest
A: Broadcast Stations 题目大意 给定一棵树,选一些节点iii,赋予P(i)" role="presentation">P(i)P(i)P(i) ...
- 2021年度训练联盟热身训练赛第四场 H - Rock Paper Scissors(字符串匹配,FFT)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 2021年度训练联盟热身训练赛第四场 H - Rock Paper Scissors(字符串匹配,FF ...
- Problem H Rock Paper Scissors,FFT
题目 题目链接 题意 给出两段石头剪刀布的顺序SSS和T" role="presentation" style="position: relative;&quo ...
- 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)...
2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...
- Problem 1002-2017 ACM/ICPC Asia Regional Shenyang Online
网络赛:2017 ACM/ICPC Asia Regional Shenyang Online 题目来源:cable cable cable Problem Description: Connecti ...
- 2015 ACM/ICPC Asia Regional Shenyang Online题解
以下所有AC题解程序来自"仙客传奇"团队. AC题数:7/13 ABCFGJL A. Traversal AC的C++语言程序: #include <bits/stdc++. ...
- 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 ...
- 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 ...
- 【Codeforces 1426 E】Rock, Paper, Scissors,贪心!算反面
problem E. Rock, Paper, Scissors time limit per test1 second memory limit per test256 megabytes inpu ...
最新文章
- php 进程 线程,php进程还是线程
- 详解centos7使用无线wifi连接的方法
- 经典C语言程序100例之三零
- Hacking techniques automation
- 最常用计算机机箱,电脑机箱的常用材质是什么?
- Magento教程 22:如何确认订单报表?
- [Ajax] Ajax的基本用法
- Python入门2_之列表元组
- webService返回自定义类型的数据处理
- 提升交互设计必备的28本好书
- 车企进军手机市场,意在智能汽车
- “垃圾食品”卫龙欲洗白上市,藏在“辣条一哥”背后的暴利生意经
- *Algs4-1.4.26-三点共线-(未解决)
- 米家蓝牙温湿度计2接入树莓派并通过homeassistant显示
- Markdown中如何插入EXCEL表格
- 一文看尽2020上半年阿里、腾讯、百度入选AI顶会论文
- 简单跑酷java代码_如何实现一个简单的跑酷游戏?(代码详解)
- 3288 配置声卡芯片
- WIN7下开机欢迎界面去掉画面下方windows 7 旗舰版
- BCG 全局主题样式
热门文章
- 谷歌浏览器自动翻译当前网页
- 新一代 IT 服务管理平台 DOSM,助力企业数字化转型
- Win10系统电脑玩地平线4闪退解决方法教学
- Android之APP跳转到权限设置界面适配华为、小米、vivo等
- 程序员面试揭秘之程序员靠什么途径去美国工作?
- 画中画视频怎么制作?学会这招,让你成为短视频高手!
- 单位强制解除与员工的劳动关系怎么办
- 女巫小屋的指令Java_我的世界女巫小屋详介绍 我的世界女巫小屋种子代码一览...
- 社区宽带繁忙是什么意思_智慧社区盈利模式分析
- cad计算机绘注意事项,CAD打印的基本操作和重要的注意事项