• [思维][暴力] Jzoj P5912 VanUSee


    Description

            众所周知,cqf童鞋对哲学有着深入的理解和认识,并常常将哲学思想应用在实际生活中,例如锻炼摔角技术或者研究化(fa)学。
           由于cqf童鞋哲学造诣太过高深,以至于影响到了pty,他们常常给在一块VanUSee。Van的都是一些像“装备回收交易自由”、“开局一条鲲进化全靠吞”、“今晚八点是兄弟就来肝”这样高端大气上档次的著名USee。
           有一天他们决定Van一个亲民的USee来和大家分享他们的哲学心路历程
    规则是这样的:
           “给定两个串S和T,|S| >= |T|。
           cqf和pty轮流操作串S,cqf先手。
           对于每次操作,cqf或pty会选择删掉S的第一位或最后一位。
           当操作以后的串的长度等于|T|时,游戏停止。
           如果停止时的串=T,则pty获胜,否则cqf获胜。”
           cqf和pty的哲学思维都很强,他们都能采取最优的策略来行动
           作为高级玩家的苏巴先生在一旁观战,他早已看穿了这个USee的本质,当两个串给出的那一瞬间胜负已分,然而不是所有围观者的水平都像苏巴先生那么高,其中也没有五年级的积分小哥,他们又想知道结果,于是围观者们找到了能预见一局围棋接下来40手的你。
     

    Input

    有多组数据
    第一行一个正整数t表示数据组数
    接下来t组数据,每组数据两行,接下来总共2t行
       第一行一个字符串S
        第二行一个字符串T
    字符串仅由小写字符组成

    Output

    t行,对于每一组数据输出双方都是最优策略时谁是赢家(“cqf”或者“pty”,不含引号,小写)
     

    Sample Input

    5
    aba
    b
    bab
    b
    aaab
    ab
    xyz
    mnk
    xyz
    xyz
    
     

    Sample Output

    pty
    pty
    cqf
    cqf
    pty
    样例解释:
    对于第一组S=“aba”,T=“b”
    cqf无论删掉头还是尾,pty都可以删掉另一个来使剩下的是“b”
    对于第三组S=“aaab”,T=“ab”
    cqf只需第一次删掉“b”,以后就永远不能达到“ab”了
     

    Data Constraint

    对于30%的数据,1<=|T|<=|S|<=20
    对于100%的数据,1<=t<=10  1<=|T|<=|S|<=100000

    题解

    • 首先,当|S|-|T|为奇数时,cdf是最后一个操作的,那么他不想让字符串匹配

    • 这样的话,如果pty要赢的话那只能把前面字符删掉也可以匹配、把后面字符删掉也可以匹配

    • 如果|S|-|T|为偶数时,pty是最后一个操作的
    • 如果0不是,并且-2和2不全是,那么cqf一定会朝不是的那一边走,pty无论如何都没有办法将它拉回到是的那一边了

       

    • 因此pty会赢当且仅当0是目标状态或者-2和2都是目标状态 

    • S中要匹配的串应该是在|S|-|T|/2开始的,因为如果在前面一点的话,cqf一直删掉左边的也可以把原串删掉

    代码

     1 #include <cstdio>
     2 #include <cstring>
     3 using namespace std;
     4 int n,t,len1,len2,flag;
     5 char l1[500010],l2[500010];
     6 bool pd(int x)
     7 {
     8     for (int i=1;i<=len2;i++) if (l1[x+i]!=l2[i]) return false;
     9     return true;
    10 }
    11 int main()
    12 {
    13     freopen("vanusee.in","r",stdin),freopen("vanusee.out","w",stdout);
    14     scanf("%d",&t);
    15     while (t--)
    16     {
    17         scanf("%s%s",l1+1,l2+1);
    18         len1=strlen(l1+1),len2=strlen(l2+1),flag=0;
    19         if (len1==len2)
    20         {
    21             if (pd(0)) flag=1;
    22         }
    23         else
    24             if ((len1-len2)%2==1) flag=pd((len1-len2-1)/2)&&pd((len1-len2+1)/2);
    25             else flag=pd((len1-len2)/2)||pd((len1-len2-2)/2)||pd((len1-len2+2)/2);
    26         if (flag==1) printf("pty
    "); else printf("cqf
    ");
    27     } 
    28 }
  • 相关阅读:
    CSS选择器规范
    利用form的“acceptcharset”在不同编码的页面间提交表单
    学习Ruby的基础知识
    Watir和watir webdriver的区别
    PHP in_array() 函数
    Ruby数组的基础知识
    PHP smarty if的条件修饰词
    很好的自动化学习资料 Ruby watir selenium
    $(document).ready() 和window.onload
    收藏:简单的PHP+SMARTY分页类
  • 原文地址:https://www.cnblogs.com/Comfortable/p/9814347.html
Copyright © 2020-2023  润新知