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

题目链接:https://nanti.jisuanke.com/t/26219

Rock Paper Scissors Lizard Spock

Description:

Didi is a curious baby. One day, she finds a curious game, which named Rock Paper Scissors Lizard Spock.

The game is an upgraded version of the game named Rock, Paper, Scissors. Each player chooses an option . And then those players show their choices that was previously hidden at the same time. If the winner defeats the others, she gets a point.

The rules are as follows.

Scissors cuts Paper

Paper covers Rock

Rock crushes Lizard

Lizard poisons Spock

Spock smashes Scissors

Scissors decapitates Lizard

Lizard eats Paper

Paper disproves Spock

Spock vaporizes Rock

(and as it always has) Rock crushes Scissors.

(this pic is from baike.baidu.com)

But
Didi is a little silly, she always loses the game. In order to keep her
calm, her friend Tangtang writes down the order on a list and show it
to her. Didi also writes down her order on another list, like

.

(Rock-R Paper-P Scissors-S Lizard-L Spock-K)

However, Didi may skip some her friends' choices to find the position to get the most winning points of the game, like

Can you help Didi find the max points she can get?

Input:

The first line contains the list of choices of Didi's friend, the second line contains the list of choices of Didi.

(1<=len(s2)<=len(s1)<=1e6)

Output:

One line contains an integer indicating the maximum number of wining point.

忽略每行输出的末尾多余空格

样例输入1

RRRRRRRRRLLL
RRRS

样例输出1

3

样例输入2

RSSPKKLLRKPS
RSRS

样例输出2

2
ACM-ICPC Asia Training League   宁夏理工学院

题解:

因为之前做过codeforces 528D. Fuzzy Search  ,感觉就不难了,你要是不会这题可以先去做cf528d,有个详细的题解:https://blog.csdn.net/u013368721/article/details/45565729

【FFT求字符串匹配的问题一般都是将模式串反转,然后将其与主串进行卷积运算】

枚举五种出拳方式,每种都做fft,最后扫一遍最大值即可求出最佳匹配出的赢的最大次数。(具体fft原理不懂orz,我就是套着原来板子写的...)

#include<bits/stdc++.h>
#define CLR(a,b) memset((a),(b),sizeof((a)))
using namespace std;
typedef long long ll;
const int N = <<;
const double PI = acos(-1.0);
int n, m;
struct Complex {
double x,y;
Complex(double _x = 0.0,double _y = 0.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);
}
Complex operator * (const double &b)const{
return Complex(x * b,y * b);
}
Complex operator / (const double &b)const{
return Complex(x / b,y / b);
}
};
void change(Complex y[], int len) {
int i, j, k;
for(i = , j = len/;i <len-;i++) {
if(i < j)swap(y[i],y[j]);
k = len/;
while(j >= k) {
j -= k;
k /= ;
}
if(j < k) j += k;
}
}
void fft(Complex y[],int len,int on) {
change(y,len);
for(int h = ; h <= len; h <<= ) {
Complex wn(cos(-on**PI/h),sin(-on**PI/h));
for(int j = ;j < len;j+=h) {
Complex w(,);
for(int k = j;k < j+h/;k++) {
Complex u = y[k];
Complex t = w*y[k+h/];
y[k] = u+t;
y[k+h/] = u-t;
w = w*wn;
}
}
}
if(on == -)
for(int i = ;i < len;i++)
y[i].x /= len;
}
Complex a[N], b[N], c[N];
char s[N], t[N];
int sum[N];
int main() {
int i, j, ans = , ma, nn;
scanf("%s %s", s, t);
n = strlen(s);
m = strlen(t);
reverse(t, t+m);
ma = max(n, m); nn = ;
while(nn < * ma) nn<<=;
CLR(c, ); CLR(sum, );
//R vs L S
CLR(a, ); CLR(b, );
for(i = ; i < n; ++i) a[i].x = (s[i]=='L'||s[i]=='S');
for(i = ; i < m; ++i) b[i].x = (t[i]=='R');
fft(a, nn, ); fft(b, nn, );
for(i = ; i < nn ;++i) c[i] = a[i] * b[i];
fft(c, nn, -);
for(i = m-; i < n; ++i)
sum[i] += (int)(c[i].x+0.5);
//P vs R K
CLR(a, ); CLR(b, );
for(i = ; i < n; ++i) a[i].x = (s[i]=='R'||s[i]=='K');
for(i = ; i < m; ++i) b[i].x = (t[i]=='P');
fft(a, nn, ); fft(b, nn, );
for(i = ; i < nn ;++i) c[i] = a[i] * b[i];
fft(c, nn, -);
for(i = m-; i < n; ++i)
sum[i] += (int)(c[i].x+0.5);
//S vs P L
CLR(a, ); CLR(b, );
for(i = ; i < n; ++i) a[i].x = (s[i]=='P'||s[i]=='L');
for(i = ; i < m; ++i) b[i].x = (t[i]=='S');
fft(a, nn, ); fft(b, nn, );
for(i = ; i < nn ;++i) c[i] = a[i] * b[i];
fft(c, nn, -);
for(i = m-; i < n; ++i)
sum[i] += (int)(c[i].x+0.5);
//L vs P K
CLR(a, ); CLR(b, );
for(i = ; i < n; ++i) a[i].x = (s[i]=='P'||s[i]=='K');
for(i = ; i < m; ++i) b[i].x = (t[i]=='L');
fft(a, nn, ); fft(b, nn, );
for(i = ; i < nn ;++i) c[i] = a[i] * b[i];
fft(c, nn, -);
for(i = m-; i < n; ++i)
sum[i] += (int)(c[i].x+0.5);
//K vs R S
CLR(a, ); CLR(b, );
for(i = ; i < n; ++i) a[i].x = (s[i]=='R'||s[i]=='S');
for(i = ; i < m; ++i) b[i].x = (t[i]=='K');
fft(a, nn, ); fft(b, nn, );
for(i = ; i < nn ;++i) c[i] = a[i] * b[i];
fft(c, nn, -);
for(i = m-; i < n; ++i)
sum[i] += (int)(c[i].x+0.5);
for(i = m-; i < n; ++i) ans = max(ans, sum[i]);
printf("%d\n", ans);
return ;
}

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

  1. 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 F题 Clever King(最小割)

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

  2. 计蒜客 25985.Goldbach-米勒拉宾素数判定(大素数) (2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 B)

    若干年之前的一道题,当时能写出来还是超级开心的,虽然是个板子题.一直忘记写博客,备忘一下. 米勒拉判大素数,关于米勒拉宾是个什么东西,传送门了解一下:biubiubiu~ B. Goldbach 题目 ...

  3. 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 I. Reversion Count (java大数)

    Description: There is a positive integer X, X's reversion count is Y. For example, X=123, Y=321; X=1 ...

  4. 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 D Merchandise (斜率优化)

    Description: The elderly aunts always like to look for bargains and preferential merchandise. Now th ...

  5. 2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&源码(A.高斯消元,D,模拟,E,前缀和,F,LCS,H,Prim算法,I,胡搞,J,树状数组)

    A------------------------------------------------------------------------------------ 题目链接:http://20 ...

  6. 第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛(沈阳)

    有时候,很简单的模板题,可能有人没有做出来,(特指 I ),到时候一定要把所有的题目全部看一遍 目录 B 题解 E F 题解 H I 题解&代码 J B 输入样例 3 2 1 2 1 2 3 ...

  7. 2018中国大学生程序设计竞赛 - 网络选拔赛 1001 - Buy and Resell 【优先队列维护最小堆+贪心】

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6438 Buy and Resell Time Limit: 2000/1000 MS (Java/O ...

  8. 2018中国大学生程序设计竞赛 - 网络选拔赛 1010 YJJ's Salesman 【离散化+树状数组维护区间最大值】

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6447 YJJ's Salesman Time Limit: 4000/2000 MS (Java/O ...

  9. 2018中国大学生程序设计竞赛 - 网络选拔赛 1009 - Tree and Permutation 【dfs+树上两点距离和】

    Tree and Permutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

随机推荐

  1. WPF Trigger for IsSelected in a DataTemplate for ListBox items

    <DataTemplate DataType="{x:Type vm:HeaderSlugViewModel}"> <vw:HeaderSlugView /> ...

  2. portable-net45+win8

    <PropertyGroup> <TargetFramework>netcoreapp1.1</TargetFramework> <RuntimeFramew ...

  3. 啰哩吧嗦式讲解在windows 家庭版安装docker

    1.docker是什么,为什么要使用docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中, 然后发布到任何流行的 Linux 机器上,也可以实 ...

  4. java工具类-交易码

    /** * 功能描述:交易码 * */ public class TransCode { //登录 public static final String LOGIN="A001"; ...

  5. php5.6+apache2.4+linux搭建php环境

    前言 最近突然想搭建个人博客,尽管笔者擅长java-web,但综合各种原因,于是选择了大众化的php+mysql搭建个人博客.对于php,只闻其大名,但从未学过,于是,笔者将从php环境搭建开始,到服 ...

  6. 用数组指针遍历数组,FOR/FOREACH遍历数组

    1. 用数组指针遍历一维数组 <?php header("Content-type:text/html;charset=utf-8"); /*用数组指针遍历一位数组的值*/ ...

  7. BZOJ4675: 点对游戏

    传送门 考虑每一对幸运点对的贡献,假设有 \(v\) 对 一共可以选择 \(x\) 个点,总共 \(n\) 个点 那么答案就是 \[v\times\frac{A_{n-2}^{x-2}x(x-1)}{ ...

  8. JS全局变量VAR和THIS--在函数内部,加var是局部变量,不加是全局变量

    JS全局变量VAR和THIS 2011-05-23 21:43 很多人都觉得在JavaScript声明一个变量,加var和不加var没有什么区别,实际上是一个错误的观点,如果在函数外面,也就是说在wi ...

  9. sublime text插件推荐

    time: 2016-05-23 13:00 --- 用了Sublime Text有一段时间了,之前被周围的几个前端小伙伴灌输的思想就是,牛b的前端程序员都是手写代码的,用代码提示啥的都low,然而上 ...

  10. Ubuntu下卸载QT5.7.1再重装

    /**** 卸载QT5.7.1 *****/ .首先找到QT安装文件的位置,例如我的在/home/ttwang/software/qt5.7.1 .终端输入命令进入该目录,输入命令: ./Mainte ...