摘要:
跟2010福州的现场赛那题基本一样的,只是多了个去重。。上半年在金华邀请赛的时候还不会AC自动机,今天突然想起来就找出来写了一下。。数据给的很大,不过空间给的也是巨大=。= 解码后就是裸的自动机,把包含的串标记一下,再用自动机找这些串的子串去重即可。 1 #include <string.h> 2 #include <stdio.h> 3 #define MAXN 3000000 4 int cas, n; 5 int pos, next[MAXN][26], fail[MAXN], id[MAXN], flag[MAXN]; 6 char s[MAXN*2], ss[ 阅读全文
posted @ 2012-10-04 21:44
Burn_E
阅读(456)
评论(0)
推荐(0)
摘要:
求区间内该数的值模该数的各位数字和为0的数有多少个。 没想到简洁的状态,d[i][s][mod][r]表示i位,前缀和为s,总和为mod,%mod=r的数有多少个。 1 #include <string.h> 2 #include <stdio.h> 3 #include <algorithm> 4 //i位,前缀和为s,总和为mod,%mod=r的数有多少个 5 int num[10], len, ans, sum, d[10][82][82][82]; 6 int dfs(int i, int s, int mod, int r, bool e){ 7 阅读全文
posted @ 2012-10-04 16:26
Burn_E
阅读(360)
评论(0)
推荐(0)
摘要:
一堆N个石头,每人每回合可以将其分成K和N^K两堆,并且满足K<N且N^K<N,最后不能移动的人失败。 用F(N)代表N里面1的个数,容易推出F(N)和F(K)+F(N^K)的奇偶性相同。最后的终态是F(X)=1,即最后的堆数只和1的个数有关。所以如果F(N)=奇数,一定经过偶数次操作到达终态,如果F(N)是偶数,一定经过奇数次操作到达终态。 所以只要看1的个数为奇数的堆有多少个就知道输赢了。 1 #include <string.h> 2 #include <stdio.h> 3 #include <algorithm> 4 using nam 阅读全文
posted @ 2012-10-04 16:20
Burn_E
阅读(300)
评论(0)
推荐(0)
摘要:
长度为N的格子,Alice和Bob各占了最左边以及最右边K个格子,每回合每人可以选择一个棋子往对面最近的一个空格移动。最先不能移动的人获得胜利。 官方题解: k=1时 很容易看出,n为奇数则后手获胜,n为偶数则先手获胜 k>1时 如果n=2*k+1,则棋 盘中只有一个空白的格子,每次移动必须移动到当前的空白格子上。先手方可以先随意选择一颗棋子占据中间的位置,然后双方互有移动,移动过程中双方肯定都会 选择一颗在己方半场的棋子移动到对方半场里。直到后手方还剩下一颗己方半场的棋子时,先手方把占据中间的棋子移动到对方半场,此时后手方必须移动剩下的这 颗棋子到空出的中间的格子里,先手方再把... 阅读全文
posted @ 2012-10-04 15:48
Burn_E
阅读(280)
评论(0)
推荐(0)
摘要:
之前无聊时还想到过这个东西,没想到多校就出出来了。。 结论是面积最大时正好是圆的内接四边形,证明网上可以找到。。 1 #include <stdio.h> 2 #include <math.h> 3 #include <algorithm> 4 double l[4]; 5 int cas; 6 double hl(){ 7 double p=(l[0]+l[1]+l[2]+l[3]) / 2; 8 return sqrt((p-l[0])*(p-l[1])*(p-l[2])*(p-l[3])); 9 }10 int main(){11 scanf(&quo 阅读全文
posted @ 2012-10-04 08:55
Burn_E
阅读(224)
评论(0)
推荐(0)
摘要:
有N个点,每次可以从起点出发到1或者2个点然后回到起点,问走过所有的点需要的最小路程(路程定义为欧氏距离的平方)。 显然,到一个点路径为S->i->S,到两个点走过的路径为S->i->j->S。状态压缩然后枚举即可。因为和顺序无关,每次只要枚举最小的没有走的点,然后枚举到这个点返回或者到这个点再去另一个点之后返回的路径长度,相同的状态取最小值即可。 1 #include <string.h> 2 #include <stdio.h> 3 #include <algorithm> 4 #define INF 0x3f3f3f3f 阅读全文
posted @ 2012-10-04 08:51
Burn_E
阅读(218)
评论(0)
推荐(0)
摘要:
给出C1,C2以及若干种操作,在C1,C2直接相互赋值加减,或者C1(C2)加某个常数,或者C1(C2)乘某个常数,求最后C2的值。 可以转化成矩阵来做,根据不同的组合可以转化成13种矩阵操作,乘起来之后快速幂即可。 代码写的比较暴力。。 1 #include <stdio.h> 2 #include <string.h> 3 typedef long long LL; 4 const LL MOD = 1000000007; 5 int op[13][3][3]={ 6 { //SET C1,C1,SET C2,C2 7 {1,0,0},{0,1,0},{0,0,.. 阅读全文
posted @ 2012-10-04 01:30
Burn_E
阅读(314)
评论(0)
推荐(0)
浙公网安备 33010602011771号