1. 程式人生 > >[思維][暴力] Jzoj P5912 VanUSee

[思維][暴力] Jzoj P5912 VanUSee

有著 回收 while sam 操作 inpu name pty -a

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 }

[思維][暴力] Jzoj P5912 VanUSee