[思维][暴力] 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\n"); else printf("cqf\n");
27     } 
28 }

 

posted @ 2018-10-19 07:59  BEYang_Z  阅读(187)  评论(0编辑  收藏  举报