字符串操作
1 | cin:getline(char *,int n);//输入操作 |
1 | cin:getline(char *,int n);//输入操作 |
用于统计,排序和保存大量的字符串(但不仅限于字符串,如01字典树)
1 | const int N = 1000050; |
如果是查询某个单词的话,我们用bool变量 v[i]表示节点i是否是单词结束的标志。 那么最后return的是v[root],所以在插入操作中插入完每个单词是,要对单词最后一个字母的v[i]置为true,其他的都是false
1 | /* |
开一个sum[],表示位置i被访问过的次数,那么最后return的是sum[root],插入操作中每访问一个节点,都要让他的sum++,这里前缀的次数是标记在前缀的最后一个字母所在位置的后一个位置上。
1 | #include<iostream> |
给定 N堆物品,第 i 堆物品有 $a_i$个。两名玩家轮流行动,每次可以任选一堆,取走任意多个物品,可把一堆取光,但不能不取。取走最后一件物品者获胜。两人都采取最优策略,问先手是否必胜
结论:定义 Nim 和为$a_1\oplus a_2\oplus a_3…\oplus a_n$,当且仅当 Nim和为 0 时,该状态为先手必败状态 否则该状态为先手必胜状态
有 1 堆石子,总个数是 n ,两名玩家轮流在石子堆中拿石子,每次至少取 1 个,至多取 m 个。取走最后一个石子的玩家为胜者。判定先手和后手谁胜。
结论: 若 n%(m+1)==0
,则先手获胜,否则后手获胜
有一个长度为n的序列${c_i}$,现在给出m个询问,每次给出两个数l,r,从编号在l到r之间的数中随机选出两个不同的数,求两个数相等的概率
1 | #include <algorithm> |