1. 程式人生 > >[結論]JZOJ 5912 VanUSee

[結論]JZOJ 5912 VanUSee

field 然而 們的 pre clas splay 童鞋 偏移 數據

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

Hint

這題確實很有趣。

分析

首先我們知道,最優策略就是和對方進行相反操作(顯而易見)

然後我們先討論串一減掉串二剩下字符個數為偶數的情況

首先如果有個字符串在正中間pty必贏

然後我們考慮字符串各往左右偏移一格的情況

pty可以在對方刪掉一邊以後再刪一次那一邊,然後對方為了贏會反轉操作,那麽就可以向左/右多進一格,也只能多進一個

那麽偶數情況只有兩種:

1、正中間

2、中間左右各偏移一格都是串二

考慮奇數,容易想到和偶數也差不多一個情況(2)

技術分享圖片
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
string a,b;
int main() {
    freopen("vanusee.in","r",stdin);
    freopen("vanusee.out","w",stdout);
    int t;
    scanf("%d",&t);
    while (t--) {
        cin>>a>>b;
        int l1=a.length(),l2=b.length();
        if (l1<=l2) {
            if (a==b) {
                printf("pty\n");
                continue;
            }
            printf("cqf\n");
            continue;
        }
        if (!((l1-l2)%2)) {
            string aleft=a.substr((l1-l2>>1)-1,l2),
            amid=a.substr((l1-l2>>1),l2),
            aright=a.substr((l1-l2>>1)+1,l2);
            if (aleft==aright&&aleft==b||amid==b) {
                printf("pty\n");
                continue;
            }
            printf("cqf\n");
            continue;
        }
        string aleft=a.substr(l1-l2>>1,l2),
        aright=a.substr((l1-l2>>1)+1,l2);
        if (aleft==aright&&aleft==b)
            printf("pty\n");
            else printf("cqf\n");
    }
}
View Code

[結論]JZOJ 5912 VanUSee