题目

题目链接

题意

给出两段石头剪刀布的顺序SSS和T" role="presentation" style="position: relative;">TTT,其中TTT要短一些,现在让你把T" role="presentation" style="position: relative;">TTT往SSS的某个位置上靠,使得靠好了以后,T" role="presentation" style="position: relative;">TTT能赢SSS的子段的次数最大。
如图:

题解

这道题很典型的FFT啦,首先我们把T" role="presentation" style="position: relative;">TTT序列换成它能赢的序列T′T′T',也就是TTT序列中的R、S、P" role="presentation" style="position: relative;">R、S、PR、S、PR、S、P对应的换成S、P、RS、P、RS、P、R形成T′T′T'。

这样的话,我们只需要在SSS中找一段匹配程度最大的就可以了,这的最大的匹配程度就是答案。

为了匹配,我们把T′" role="presentation" style="position: relative;">T′T′T'倒换过来,记为rT′rT′rT',我们想象一下做卷积的过程,
发现新的卷积序列中的第kkk个位置的值等于S[k−lenT,k−1]" role="presentation" style="position: relative;">S[k−lenT,k−1]S[k−lenT,k−1]S[k-lenT,k-1]与T′T′T'序列对应位置乘积之和。

为了使用卷积解决这个问题,我们把问题拆成3部分,即单独考虑P、S、RP、S、RP、S、R时候,最大匹配程度,最后将相同位置的匹配程度加起来就可以了。

代码

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
double pi = acos(-1.0);
struct complex{double re,im;complex(double r = 0.0,double i = 0.0):re(r),im(i){};complex operator+(complex com){return complex(re+com.re,im+com.im);}complex operator-(complex com){return complex(re-com.re,im-com.im);}complex operator*(complex com){return complex(re*com.re-im*com.im,re*com.im+im*com.re);}
};
complex wn,wntmp;
void rader(complex arr[],int n){int num = n-1;for(int i = 0;i < n;++i){int tn = n>>1;while(num && num >= tn) num ^= tn,tn >>= 1;num |= tn;if(num > i) swap(arr[i],arr[num]);}
}
void FFT(complex cs[],int n,int f){rader(cs,n);for(int s = 1;s < n;s <<= 1){wn = complex(cos(f*2*pi/(s*2)),sin(f*2*pi/(s*2)));for(int offset = 0;offset < n;offset += s<<1){wntmp = complex(1.0,0.0);for(int i = 0;i < s;++i){complex u = cs[offset+i],v = cs[offset+i+s]*wntmp;cs[offset+i] = u + v;cs[offset+i+s] = u - v;wntmp = wntmp * wn;}}}if(f == -1)for(int i = 0;i < n;++i)cs[i].re /= n;
}
int n,m;
const int maxn = 1e5+7;
char S[maxn],T[maxn];
int ans[maxn*4];
complex csA[maxn*4],csB[maxn*4];
#define pr(x) cout<<#x<<":"<<x<<endl
void solve(char c){memset(csA,0,sizeof(csA));memset(csB,0,sizeof(csB));for(int i = 0;i < n;++i) csA[i] = complex(S[i]==c?1.0:0);for(int i = 0;i < m;++i) csB[i] = complex(T[i]==c?1.0:0);int len = 1;while(len < n) len<<=1;len <<= 1;FFT(csA,len,1);FFT(csB,len,1);for(int i = 0;i < len;++i) csA[i] = csA[i]*csB[i];FFT(csA,len,-1);for(int i = m-1;i < len;++i) {ans[i] += int(csA[i].re+0.5);};}
char big(char c){if(c == 'R') return 'S';if(c == 'S') return 'P';if(c == 'P') return 'R';
}
int main(){cin>>n>>m>>S>>T;for(int i = 0;i < m/2;++i) swap(T[i],T[m-1-i]);for(int i = 0;i < m;++i) T[i] = big(T[i]);solve('P');solve('S');solve('R');int mx = 0;for(int i = 0;i < n+m+1;++i) mx = max(mx,ans[i]);cout<<mx<<endl;return 0;
}

Problem H Rock Paper Scissors,FFT相关推荐

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

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

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

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

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

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

  4. Python编程基础:第三十七节 石头剪刀布游戏Rock, Paper, Scissors Game

    第三十七节 石头剪刀布游戏Rock, Paper, Scissors Game 前言 实践 前言 我们这一节的内容主要是对前边学习内容的一个综合应用,以石头,剪刀,布游戏为例讲解列表.随机数.用户输入 ...

  5. 计蒜客A1676 Rock Paper Scissors Lizard Spock

    链接 https://nanti.jisuanke.com/t/A1676 题解 每种分开算,比如我先考虑出 s c i s s o r s scissors scissors,把模式串中的所有 S ...

  6. CodeForces - 1426E Rock, Paper, Scissors(最小费用最大流+最大费用最大流)

    题目链接:点击查看 题目大意:A 和 B 在玩石头剪刀布,A 会出 a1 次石头,a2 次剪刀,a3 次布,同理 B 会出 b1 次石头,b2 次剪刀,b3 次布,若对战顺序是可以进行决定的,问 A ...

  7. Rock Paper将为圣地亚哥教士棒球队开发AR游戏

    7月18日青亭网报道,联想.摩托罗拉,以及Rock Paper Reality,将联合圣地亚哥教士棒球队开发一款棒球主题的AR游戏. 很显然,目前高通骁龙Spaces XR开发套件就是基于上述硬件:摩 ...

  8. 【AI白身境】究竟谁是paper之王,全球前10的计算机科学家

    文章首发于微信公众号<有三AI> [AI白身境]究竟谁是paper之王,全球前10的计算机科学家 今天是新专栏<AI白身境>的第十二篇,也是最后一篇了,作为最后一篇,我的想法是 ...

  9. NEERC13 Problem H.Hack Protection

    NEERC13 Problem H.Hack Protection Solution 注意到题目中的区间与,在左端点lll确定的情况下,对于所有r≥lr\geq lr≥l,ANDl,rAND_{l,r ...

最新文章

  1. java服务端开发 php_PHP使用thrift做服务端开发
  2. win7(旗舰版)下,OleLoadPicture 加载内存中的图片(MagickGetImageBlob),返回值 0
  3. 2019年安徽省模块七满分多少_艺考资讯 | 2021年美术统考考多少分才能通过?过了合格线有什么意义?美术生一定要重视!...
  4. 网络爬虫:URL去重策略之布隆过滤器(BloomFilter)的使用
  5. Linux中使用Systemtap调试SLUB
  6. iText 实践的目录(the content of iText in Action)
  7. DataGridView 与货币管理器的位置关联的行不能设置为不可见
  8. 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
  9. linux红帽认证考试费,红帽rhce认证考试费用是多少?
  10. 解决Python print 输出文本显示 gbk 编码错误问题
  11. IPD不仅是流程更是管理体系(附华为IPD培训资料)
  12. 海康8700等联网网关通过GB28181接入LiveGBS流媒体服务实现web端无插件直播
  13. 电阻的寄生电感、寄生电容
  14. 数据产品经理——数据指标
  15. 关于照片(img)的水平居中和垂直居中
  16. 为什么Rust语言正在兴起
  17. 人脉就是钱脉,培养人脉的100个技巧。。。
  18. 极客日报第118期:京东被曝显卡售后不肯维修要原价退款;​IBM发布第一个2纳米芯片;Bootstrap 5.0.0发布
  19. Android 第三次作业 contentprovider与resolver
  20. 艾恩技术access sql asp

热门文章

  1. css中的单位换算_金蝶ERP入门教程:动态换算率及辅助计量单位的应用
  2. 算法设计与分析——贪心算法——最优装载问题
  3. mysql or 创建索引_Mysql索引优化
  4. ai进入轮廓模式怎么退出_详解AI中扩展、扩展外观、轮廓化描边、创建轮廓
  5. [Swagger2]分组和接口注释及小结
  6. [mybatis]typeHandlers日期类型的处理
  7. [Java网络编程基础]InetAddress的使用
  8. tof摄像头手势识别_一种基于TOF手势识别的控制系统的制作方法
  9. arcgis 获取json经纬度_干货|ArcGIS的矢量化操作——ArcGis中进行地形图的配准
  10. WARNING: Ignoring invalid distribution -ip