51nod 1490 多重遊戲(樹上博弈)

2021-08-07 02:38:53 字數 1603 閱讀 5663

1490 多重遊戲

codeforces

基準時間限制:1 秒 空間限制:131072 kb 分值: 40 

難度:4級演算法題

有乙個兩人遊戲,遊戲是這樣的,有n個非空串。在遊戲的過程是,兩個玩家輪流向乙個字串後面加字母,剛開始字串是空的。每一次操作是向當前字串後面新增字元,形成的新字串一定要是這n個串中某乙個或幾個的字首,如果無法做到,就輸了。

這樣的遊戲似乎過於簡單了,現在對這個遊戲進行一下改進,讓玩家玩k次這樣的遊戲,第i次的敗者,將會作為第i+1次的先手進行這個遊戲。第k次遊戲的贏家就是整個遊戲的贏家。

現在給定n個字串和k,問是先手勝還是後手勝。

input

單組測試資料。

第一行有兩個整數n 和 k (1 ≤ n ≤ 10^5; 1 ≤ k ≤ 10^9)

接下來n行每一行有乙個非空串。字串的總長度不超過10^5,都由小字母構成。

output

如果先手勝輸出first,否則輸出second。
input示例

2 3

ab

output示例

first

system message

(題目提供者)

c++的執行時限為:1000 ms ,空間限制為:131072 kb 

示例及語言說明請按這裡

允許其他 ac 的使用者檢視此**,分享**才能檢視別人的**並有機會獲得勳章

題解:建一棵trie樹,將所有字串插入樹中,然後進行類似於樹形dp的操作,和一般的博弈不同,因為要進行k輪,並且失敗者下一輪會變成先手,所以先手要保證自己最終必贏的情況下,當前輪他可能採取必贏策略也可能採取必輸的策略(有可能他要故意輸掉前k-1輪,贏下最後一輪),故進行樹形dp的時候要分別按照先手必贏、先手必輸、可輸可贏、無法控制四種狀態dp即可。。。

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;          

typedef long long ll;

#define inf 1000000000

#define mod 1000000007

#define maxn 160050

#define lowbit(x) (x&-x)

#define eps 1e-9

char str[maxn];

int size,a[maxn][30],b[maxn];

void insert()

} if(vis==0)

b[x]=1;

}int main(void)

dfs(0);

if(b[0]==1 || b[0]==0)

printf("second\n");

if(b[0]==2)

if(b[0]==3)

printf("first\n");

return 0;

}

51nod 多重揹包模板

題目大意 有 n 種物品和乙個容量為 w 的揹包。第 i 種物品最多有 c i 件可用,每件體積是 w i 價值是 v i 求解將哪些物品裝 入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。解題思路 採用二進位制拆分的思想,將有限的揹包劃分為01揹包和完全揹包解決。轉移方程 dp i j...

51Nod1774 多重排序

有乙個陣列a,長度為n,下標從1開始。現在要對a進行m次排序,每一次排序給定兩個引數t i r i 表示要對陣列的前r i 個元素進行排序,如果t i 1則按照非降序排序,t i 2則按照非公升序排序。請輸出經過m次排序之後的陣列a。樣例解釋 第乙個樣例中,初始序列為 1 2 3。經過第一次排序之後...

51nod 1086 多重揹包模板

有n種物品,每種物品的數量為c1,c2.cn。從中任選若干件放在容量為w的揹包裡,每種物品的體積為w1,w2.wn wi為整數 與之相對應的價值為p1,p2.pn pi為整數 求揹包能夠容納的最大價值。include include include include includeusing name...