4322 字串遊戲(strgame)

2021-09-17 18:23:46 字數 1268 閱讀 2282

題意

記憶體限制:256 mib

時間限制:1000 ms

puredirty決定玩 t

tt 局遊戲。對於每一局遊戲,有 n

nn 個字串,並且每一局遊戲由 k

kk 輪組成。具體規則如下:在每一輪遊戲中,最開始有乙個空串,兩者輪流向串的末尾新增乙個字元,並且需要保證該串為 n

nn 個字串中任意乙個串的字首,不能操作的人輸掉這一輪,並且在下一輪遊戲中由該輪輸掉的人先手。另外為了遵循女士優先的原則,在每一局遊戲的第一輪均由pure先手。

玩家的目標是獲得整局遊戲的勝利,一局遊戲的勝利條件是:對手輸掉最後一輪遊戲。我們可以假定puredirty都足夠聰明。

現在,對於每一局遊戲,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

v​xo

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 ...