1490 多重遊戲
codeforces
基準時間限制:1 秒 空間限制:131072 kb 分值: 40
難度:4級演算法題
有乙個兩人遊戲,遊戲是這樣的,有n個非空串。在遊戲的過程是,兩個玩家輪流向乙個字串後面加字母,剛開始字串是空的。每一次操作是向當前字串後面新增字元,形成的新字串一定要是這n個串中某乙個或幾個的字首,如果無法做到,就輸了。
這樣的遊戲似乎過於簡單了,現在對這個遊戲進行一下改進,讓玩家玩k次這樣的遊戲,第i次的敗者,將會作為第i+1次的先手進行這個遊戲。第k次遊戲的贏家就是整個遊戲的贏家。
現在給定n個字串和k,問是先手勝還是後手勝。
input
單組測試資料。output第一行有兩個整數n 和 k (1 ≤ n ≤ 10^5; 1 ≤ k ≤ 10^9)
接下來n行每一行有乙個非空串。字串的總長度不超過10^5,都由小字母構成。
如果先手勝輸出first,否則輸出second。input示例
2 3output示例ab
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...