題意
記憶體限制:256 mib
時間限制:1000 ms
pure
和dirty
決定玩 t
tt 局遊戲。對於每一局遊戲,有 n
nn 個字串,並且每一局遊戲由 k
kk 輪組成。具體規則如下:在每一輪遊戲中,最開始有乙個空串,兩者輪流向串的末尾新增乙個字元,並且需要保證該串為 n
nn 個字串中任意乙個串的字首,不能操作的人輸掉這一輪,並且在下一輪遊戲中由該輪輸掉的人先手。另外為了遵循女士優先的原則,在每一局遊戲的第一輪均由pure
先手。
玩家的目標是獲得整局遊戲的勝利,一局遊戲的勝利條件是:對手輸掉最後一輪遊戲。我們可以假定pure
和dirty
都足夠聰明。
現在,對於每一局遊戲,pure
想知道獲勝者是誰。
1 ≤n
≤105
;1≤k
≤109
;1≤t
≤10
1 \le n \le 10^5; 1 \le k \le 10^9; 1 \le t \le 10
1≤n≤10
5;1≤
k≤10
9;1≤
t≤10
,每局遊戲字串總長不超過 105
10^5
105題解
首先建立 tri
etrie
trie
樹可以發現若當前人在葉子結點上的話,說明t
a\it
ta輸了所以每個節點 u
uu 可以表示成乙個狀態 f
uf_u
fu ,設輸的狀態為 2
22 ,贏的狀態為 1
11 ,可以控制輸贏的狀態為 3
33 ,被控制輸贏的狀態為 000
所以f u∣
=fvx
or
3f_u|=f_v \; xor \; 3
fu∣=f
vxo
r3對於根節點分類討論即可
#include using namespace std;
const int n=1e5+5;
int f[n],t,tr[n][27],t,n,k;char s[n];
void ins()
}void dfs(int x)
int main()
return 0;
}
bzoj 2121 字串遊戲
題目大意 給你乙個大字串和乙個字串的集合,每次可以從字串的集合中選出乙個,如果那個大字串中包含了這個字串,就可以從大串中將小串刪掉,刪完後兩邊接起來,求刪完後大串最少剩幾個字元 大串 150,小串 20,小串個數 30 這題沒想著怎麼做,主要還是太弱了。首先可以設f i j k l 代表第i個到第j...
bzoj 2121 字串遊戲
bx正在進行乙個字串遊戲,他手上有乙個字串l,以及其他一些字串的集合s,然後他可以進行以下操作 對於乙個在集合s中的字串p,如果p在l中出現,bx就可以選擇是否將其刪除,如果刪除,則將刪除後l 成的左右兩部分合併。舉個例子,l abcdefg s 如果bx選擇將 de 從l中刪去,則刪後的l abc...
BZOJ2121 字串遊戲
區間dp 用c l r 表示l r是否能被全部刪掉,f l r k x 表示l r和第k個串匹配是否能匹配到第x位,注意到小串的長度 21,而且f是個bool變數,所以可以把x壓成int,而推一下f的轉移方程發現對於不同的l,他們之間是互不影響的,所以可以把l這一維刪掉 那麼列舉左端點,f r k ...