将第二个字符串改成能赢对方时对方的字符并倒序后,字符串匹配就是卷积的过程。

那么就枚举字符做三次卷积即可。

#include <bits/stdc++.h>

struct Complex {
double r, i;
Complex(){}
Complex(double r, double i): r(r), i(i) {}
Complex operator + (const Complex &p) const { return Complex(r + p.r, i + p.i); }
Complex operator - (const Complex &p) const { return Complex(r - p.r, i - p.i); }
Complex operator * (const Complex &p) const { return Complex(r * p.r - i * p.i, r * p.i + i * p.r); }
}; const int N = 4e5 + ;
const double pi = acos(-1.0);
int r[N]; void FFT(Complex a[], int n, int pd) {
for (int i = ; i < n; i++)
if (i < r[i])
std::swap(a[i], a[r[i]]);
for (int mid = ; mid < n; mid <<= ) {
Complex wn(cos(pi / mid), pd * sin(pi / mid));
for (int l = mid << , j = ; j < n; j += l) {
Complex w(1.0, 0.0);
for (int k = ; k < mid; k++, w = w * wn) {
Complex u = a[k + j], v = w * a[k + j + mid];
a[k + j] = u + v;
a[k + j + mid] = u - v;
}
}
}
if (pd == -)
for (int i = ; i < n; i++)
a[i] = Complex(a[i].r / n, a[i].i / n);
} Complex A[N], B[N];
int n, m, limit, sum[N];
char s[N], t[N]; void solve(char ch) {
for (int i = ; i < n; i++)
A[i] = Complex(s[i] == ch ? : , 0.0);
for (int i = n; i < limit; i++)
A[i] = Complex(0.0, 0.0);
for (int i = ; i < m; i++)
B[i] = Complex(t[i] == ch ? 1.0 : 0.0, 0.0);
for (int i = m; i < limit; i++)
B[i] = Complex(0.0, 0.0);
FFT(A, limit, ); FFT(B, limit, );
for (int i = ; i < limit; i++)
A[i] = A[i] * B[i];
FFT(A, limit, -);
for (int i = ; i < limit; i++)
sum[i] += (int)(A[i].r + 0.5);
} int main() {
scanf("%d%d", &n, &m);
scanf("%s", s);
scanf("%s", t);
for (int i = ; i < m; i++) {
if (t[i] == 'R') t[i] = 'S';
else if (t[i] == 'S') t[i] = 'P';
else t[i] = 'R';
}
std::reverse(t, t + m);
int len = n + m;
int l = ;
limit = ;
while (limit < len) limit <<= , l++;
for (int i = ; i < limit; i++)
r[i] = r[i >> ] >> | ((i & ) << (l - ));
solve('R');
solve('S');
solve('P');
int ans = ;
for (int i = m - ; i < limit; i++)
ans = std::max(ans, sum[i]);
printf("%d\n", ans);
return ;
}

Gym101667 H. Rock Paper Scissors的更多相关文章

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

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

  2. FFT(Rock Paper Scissors Gym - 101667H)

    题目链接:https://vjudge.net/problem/Gym-101667H 题目大意:首先给你两个字符串,R代表石头,P代表布,S代表剪刀,第一个字符串代表第一个人每一次出的类型,第二个字 ...

  3. 【题解】CF1426E Rock, Paper, Scissors

    题目戳我 \(\text{Solution:}\) 考虑第二问,赢的局数最小,即输和平的局数最多. 考虑网络流,\(1,2,3\)表示\(Alice\)选择的三种可能性,\(4,5,6\)同理. 它们 ...

  4. 题解 CF1426E - Rock, Paper, Scissors

    一眼题. 第一问很简单吧,就是每个 \(\tt Alice\) 能赢的都尽量让他赢. 第二问很简单吧,就是让 \(\tt Alice\) 输的或平局的尽量多,于是跑个网络最大流.\(1 - 3\) 的 ...

  5. SDUT 3568 Rock Paper Scissors 状压统计

    就是改成把一个字符串改成三进制状压,然后分成前5位,后5位统计, 然后直接统计 f[i][j][k]代表,后5局状压为k的,前5局比和j状态比输了5局的有多少个人 复杂度是O(T*30000*25*m ...

  6. Gym - 101667H - Rock Paper Scissors FFT 求区间相同个数

    Gym - 101667H:https://vjudge.net/problem/Gym-101667H 参考:https://blog.csdn.net/weixin_37517391/articl ...

  7. HDU 2164 Rock, Paper, or Scissors?

    http://acm.hdu.edu.cn/showproblem.php?pid=2164 Problem Description Rock, Paper, Scissors is a two pl ...

  8. HDOJ(HDU) 2164 Rock, Paper, or Scissors?

    Problem Description Rock, Paper, Scissors is a two player game, where each player simultaneously cho ...

  9. [BZOJ4760][Usaco2017 Jan]Hoof, Paper, Scissors dp

    4760: [Usaco2017 Jan]Hoof, Paper, Scissors Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 136  Solv ...

随机推荐

  1. powersploit简介

    一.PowerSploit简介 PowerSploit是GitHub上面的一个安全项目,上面有很多powershell攻击脚本,它们主要被用来渗透中的信息侦察.权限提升.权限维持. Powershel ...

  2. android shape图形优化Button效果

    android shape可以让我们通过定义xml文件的方式创建图形,当然只能实现一些比较简单的图形(圆形,矩形,椭圆,线段),但是已经相当不错了,通过shape创建的图形作为控件的背景已经基本可以满 ...

  3. springboot2.0 management.security.enabled无效

    在1.5.x版本中通过management.security.enabled=false来暴露所有端点 在使用springcloud的时候,如果基于springboot2的版本的配置中心,无法使用SV ...

  4. multer 基础教程(英文版)

    Multer is a node.js middleware for handling multipart/form-data, which is primarily used for uploadi ...

  5. Comment file

    /// This is the head comment of a file. /*********************************************************** ...

  6. git commit 提交失败

    git commit -m 'xxx' 报错 报错信息 当前分支:master 远程分支:gitlib.xxx error: cannot spawn .git/hooks/commit-msg: N ...

  7. CodeForces - 560D Equivalent Strings

    Today on a lecture about strings Gerald learned a new definition of string equivalency. Two strings ...

  8. Java代码开发之《安全规约》

    安全规约 1. [强制]隶属于用户个人的页面或者功能必须进行权限控制校验.     说明:防止没有做水平权限校验就可随意访问.修改.删除别人的数据,比如查看他人的私信内容.修改 他人的订单. 2. [ ...

  9. centos6系统资源限制

    1.限制用户CPU使用资源 /etc/security/limits.conf #主配置文件 /etc/security/limits.d/ #子模块配置文件 新建一个普通用户,并查看默认资源限制 [ ...

  10. Java生鲜电商平台-供应链模块的设计与架构

    Java生鲜电商平台-供应链模块的设计与架构 说明:Java开源生鲜电商平台中供应链模块属于卖家的行为,也就是卖家如何管理他们自己的供应商,包括结算方式,压款方式,结算周期等等,超出了我这个B2B平台 ...