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

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

#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. 游戏设计艺术 第2版 (Jesse Schell 著)

    第1章 太初之时,有设计师 (已看) 第2章 设计师创造体验 第3章 体验发生于场景 第4章 体验从游戏中诞生 第5章 游戏由元素构成 第6章 元素支撑起主题 第7章 游戏始于一个创意 第8章 游戏通 ...

  2. C++中enum(转载)

    原文地址:http://www.cnblogs.com/ForFreeDom/archive/2012/03/22/2412055.html 1.为什么要用enum       写程序时,我们常常需要 ...

  3. 原生javascript 共享onload事件

    在工作时,我们给一个元素绑定了事件,如果dom还没加载完成,就执行了js代码,就不会绑定成功.常规解决方案就是用: window.onload = EventFunction; 可是如果有两个 事件, ...

  4. JVM的监控工具之jstat

    参考博客:https://www.cnblogs.com/lxcmyf/p/9878293.html jstat(JVMStatisticsMonitoringTool)是用于监视虚拟机各种运行状态信 ...

  5. matplotlib的使用——pie(饼图)的使用

    在我们进行数据分析的时候需要对得出的数据进行可视化,因此我们需要引入第三方包来帮助我们进行可视化分析,在这里使用matplotlib 一.安装 使用指令[pip install matplotlib] ...

  6. f(n-1) + f(n-2)的编译器处理

    https://gcc.godbolt.org   int addx(int a){ return a + 2; } int gooo(){ return addx(3) + addx(4) + ad ...

  7. tsconfig.json配置项详解

    { "compilerOptions": { "allowUnreachableCode": true, // 不报告执行不到的代码错误. "allo ...

  8. WPF两个按钮来回切换样式

    <!-- 两个按钮来回切换样式 --> <Style x:Key="SwicthFunctionMetroToggleButton" TargetType=&qu ...

  9. jenkins安装后提示localhost 拒绝了我们的连接请求。

    我是用msi文件安装的windows本地 ,安装文件看另外安装的博文. 此问题解决不是第一次安装方案 ,而是第一次安装完,使用也正常,关电脑再次访问的时候提示找不到 ,是因为本地服务没有启动  ,wi ...

  10. angular获取时间

    获取24小时制的时间<h1> {{time}} </h1> <script> angular.module('app', []) .controller('ctrl ...