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. c#与IronPython Clojure-clr的调用

    一,python 安装ironpython http://ironpython.net/ 新建控制台程序,引入 IronPython,Microsoft.Scripting 新建xxx.py文件 va ...

  2. Mvc Moq HttpContext

    1: public class MockMvcHttpContext 2: { 3: public Moq.Mock<System.Web.HttpContextBase> Context ...

  3. C# 委托、匿名方法、扩展方法

    一.委托的使用: 详细委托和事件解释请看另一篇:http://www.cnblogs.com/Liyuting/p/6760706.html 二.匿名方法 三.扩展方法

  4. Unity3d嵌入web网页

    应用场景 程序中的界面风格 UI内容等相关内容需要很容易方便的跟新替换,不使用unity传统的热加载方式,也不想使用和H5等做混合APP的时候, 就用嵌入web来实现. 假如我想替换某个背景图,一般来 ...

  5. java并发编程的艺术(四)---ConcurrentHashMap原理解析

    本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...

  6. properties配置文件编码问题

    properties配置文件编码问题 person.last-name=哈哈 person.age=18 person.bitrh=2019/01/12 person.boss=false perso ...

  7. K:跳表

      跳表(SkipList)是一种随机化的数据结构,目前在redis和leveldb中都有用到它,它的效率和红黑树以及 AVL 树不相上下,但跳表的原理相当简单,只要你能熟练操作链表, 就能轻松实现一 ...

  8. grafana 安装- 曲线图展示每秒新增数据量

    下载: https://dl.grafana.com/oss/release/grafana-5.4.2.windows-amd64.zip 解压就能用 添加数据源 添加查询条件 sql 模式编写查询 ...

  9. UBuntu安装配置记录

    记得是06年左右第一次安装的 Linux,当时是下载的 Fedora镜像,版本已经记不清了,在商业街的电脑维修店刻的盘,回来后兴冲冲地和XP一起安装的双系统.其实就是直接的体验了一把,只是看了看X-W ...

  10. react组件(react-grid-gallery)

    react有很多好玩的组件,react-grid-gallery就是其中一个,主要处理图片展示,对图片进行放大与缩小 文档:https://www.npmjs.com/package/react-gr ...