• [2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 ]Rock Paper Scissors Lizard Spock.(FFT)


    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.

    242dd42a2834349b5866a238c9ea15ce36d3be2f.jpg

    (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 p1.png.

    (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 p2.png

    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.

    输出时每行末尾的多余空格,不影响答案正确性

    样例输入

    RRRRRRRRRLLL
    RRRS

    样例输出

    3








    发现这题就是个套路水题
    字符集很小,枚举计算每个字符对每个开始位置作出的贡献就行了
    就很套路 qaq







    
    
     1 #include"bits/stdc++.h"
     2 #define sd(x) scanf("%lf",&(x));
     3 #define sld(x) scanf("%lld",&(x));
     4 using namespace std;
     5 
     6 const int maxn = 2e6+10;
     7 const double Pi = acos(-1.0);
     8 
     9 struct cp
    10 {
    11     double x,y;
    12     cp (double xx=0,double yy=0)
    13     {x=xx,y=yy;}
    14 }a[maxn],b[maxn];
    15 cp operator + (cp a,cp b){ return cp(a.x+b.x , a.y+b.y);}
    16 cp operator - (cp a,cp b){ return cp(a.x-b.x , a.y-b.y);}
    17 cp operator * (cp a,cp b){ return cp(a.x*b.x-a.y*b.y , a.x*b.y+a.y*b.x);}//不懂的看复数的运算那部分
    18 
    19 int n,m;
    20 int l,r[maxn];
    21 int limit = 1;
    22 
    23 
    24 inline void fft(cp *a,int ff)
    25 {
    26     for(int i=0;i<limit;i++)
    27     if(i<r[i])swap(a[i],a[r[i]]);
    28     for(int mid=1;mid<limit;mid<<=1)
    29         {
    30         cp wn(cos(Pi/mid) , ff*sin(Pi/mid));
    31         for(int R=mid<<1,j=0;j<limit;j+=R)
    32         {
    33             cp w(1,0);
    34             for(int k=0;k<mid;k++,w=w*wn)
    35             {
    36                 cp x=a[j+k],y=w*a[j+mid+k];
    37                 a[j+k]=x+y;
    38                 a[j+mid+k]=x-y;
    39             }
    40         }
    41 
    42     }
    43 
    44 
    45 }
    46 char s[2000000];
    47 char t[2000000];
    48 int ans[2000000];
    49 
    50 int main()
    51 {
    52 
    53    cin>>s>>t;
    54    n=strlen(s); m=strlen(t);
    55    reverse(t,t+m);
    56   // cout<<t<<endl;
    57    string mm="SPRLKSPRLK";
    58     while(limit<=n+m)limit<<=1,l++;
    59    for(int i=0;i<limit;i++)
    60    r[i]=(r[i>>1]>>1)|( (i&1)<<(l-1));
    61 
    62    for(int i=0;i<5;i++)
    63    {
    64        // cout<<mm[i]<<endl;
    65         for(int j=0;j<limit;j++)a[j].x=a[j].y=b[j].x=b[j].y=0;
    66         for(int j=0;j<m;j++)a[j].x=(t[j]==mm[i]);
    67         for(int j=0;j<n;j++)b[j].x=(s[j]==mm[i+1] || s[j]==mm[i+3]);
    68         //for(int j=0;j<m;j++)cout<<a[j].x<<" ";puts("");
    69       //  for(int j=0;j<n;j++)cout<<b[j].x<<" ";puts("");
    70         fft(a,1); fft(b,1);
    71         for(int j=0;j<limit;j++)a[j]=a[j]*b[j];
    72         fft(a,-1);
    73         for(int j=m-1;j<n;j++)
    74         ans[j] += int(a[j].x/limit + 0.5);
    75      //   for(int j=m-1;j<n;j++)cout<<ans[j]<<" "; puts("");
    76 
    77    }
    78    int mx=0;
    79    for(int j=m-1;j<n;j++)mx=max(mx,ans[j]);
    80    cout<<mx;
    81 
    82 
    83 
    84 
    85 
    86 
    87 
    88 }





















  • 相关阅读:
    Self Numbers
    【acdream】小晴天老师系列——竖式乘法
    全错位排列
    2 ^ x mod n = 1问题
    基于cocos2dx的横版动作游戏制作(二)
    基于cocos2dx的横版动作游戏制作(一)
    横版游戏制作之英雄技能CD遮罩,人物头像血条属性
    cocos2d横版游戏之摇杆控制
    C++ delete []p 数组指针,如何知道该数组大小的
    do { ....} while(0) 在宏里冗余的意义
  • 原文地址:https://www.cnblogs.com/zhangbuang/p/11074076.html
Copyright © 2020-2023  润新知