對於兩個字串,如果它倆互不為對方的字首,我們稱它們互為「異串」。
比如:"\(010\)" 和"\(1111\)"就互為「異串」。「\(0001\)」和"\(00\)"就不是,因為"\(00\)"是"\(0001\)"的字首。
alice在一張紙上寫下了\(n\)個字串,每個字串都是由\(0,1\)構成。任意兩個字串都互為「異串」,且字串的長度都不超過\(l\)
alice和bob開始玩「字元遊戲」,他倆輪流往紙上新增乙個新字串。
要求,新增的字串由\(0,1\)構成,長度在\([1,l]\)之間,且與當前紙上的串都互為「異串」。
誰無法新增,誰就輸掉遊戲。
alice總是先手,問誰有必勝策略。
\(1 \leq n \leq 10^5\)
\(n\)個字串長度保證不超過\(10^5\)
\(1 \leq l \leq 10^\)
看到\(01\)字串和處理判斷字首,想到\(trie\)樹,將\(trie\)樹建出來,發現在葉子節點為根的子樹內節點都無法再次到達(否則就出現了字首),又發現,我們建完\(trie\)樹後,若某節點不是葉子,且還有未去過的兒子,那麼會將這個遊戲分成若干個相同規則的遊戲。
這是乙個\(multi-sg\)問題。
所以我們只需要算出單一遊戲的\(sg\)值,最後將其異或起來,即可得到局面\(sg\)
考慮如何計算單一遊戲\(sg\)值,定義高度為從下往上數的層數。
在草稿紙上多畫畫,會發現如下規律:
\(sg(1) = 1, sg(2) = 2,sg(3) = 1,sg(4) = 4,sg(5) = 1,sg(6) = 2...\)
那麼\(sg(x)=lowbit(x)\)
於是這道題就做完了。
\(code:\)
#includeusing namespace std;
const int max_n = 100000 + 5;
typedef long long ll;
struct trietrie[max_n<<5];
int n,tot=1;
ll l;
void insert(string x)
solve(1,0);
if(ans) printf("alice");
else printf("bob");
return 0;
}
nyoj 273 字元小遊戲
時間限制 1000 ms 記憶體限制 65535 kb 難度 0 描述 給你乙個亂序的字串,裡面包含有小寫字母 a z 以及一些特殊符號,請你找出所給字串裡面所有的小寫字母的個數,拿這個數對26取餘,輸出取餘後的數字在子母表中對應的小寫字母 0對應z,1對應a,2對應b.25對應y 輸入第一行是乙個...
4322 字串遊戲(strgame)
題意 記憶體限制 256 mib 時間限制 1000 ms pure和dirty決定玩 t tt 局遊戲。對於每一局遊戲,有 n nn 個字串,並且每一局遊戲由 k kk 輪組成。具體規則如下 在每一輪遊戲中,最開始有乙個空串,兩者輪流向串的末尾新增乙個字元,並且需要保證該串為 n nn 個字串中任...
bzoj 2121 字串遊戲
題目大意 給你乙個大字串和乙個字串的集合,每次可以從字串的集合中選出乙個,如果那個大字串中包含了這個字串,就可以從大串中將小串刪掉,刪完後兩邊接起來,求刪完後大串最少剩幾個字元 大串 150,小串 20,小串個數 30 這題沒想著怎麼做,主要還是太弱了。首先可以設f i j k l 代表第i個到第j...