白书专题

AC自动机 白书模板

模板: struct ACauto{ int ch[maxn][26]; int sz; int f[maxn],last[maxn],val[maxn],cnt[maxn]; void init() { sz=1; memset(ch[0],0,sizeof ch[0]); memset(cnt,0,sizeof cnt); } int idx(char c) { return c-'

(白书训练计划)UVa 12627 Erratic Expansion(递归+找规律)

题目地址:UVa 12627 这题是先找规律,规律在于对于第k个小时的来说,总是可以分成右下角全是蓝色气球,右上角,左下角与左上角三个一模一样的k-1个小时的气球。这样的话,规律就很清晰了,然后用递归做比较方便。。。 代码如下: #include <iostream>#include <cstdio>#include <string>#include <cstring>#incl

(白书训练计划)UVa 11134 Fabled Rooks(贪心)

题目地址:UVa 11134 这题因为行与列是无关的,互无影响的。所以可以将行或列分开来计算。这就相当于转化成了在期间[1,n]内选择n个不同的整数,使得第i个整数在闭区间[Li,Ri]内。这就转换成了一个贪心问题了。但是注意不能先按照左端点排序,再按右端点排序,然后尽量往左边放,比如,(1,1),(1,3),(2,2),这样是不对的,应该按右端点为主关键字排序,再按左端点为次关键字排序。看到网

(白书训练计划)UVa 11572 Unique Snowflakes(窗口滑动法)

题目地址:UVa 11572 这种方法以前接触过,定义两个指针,不断从左向右滑动,判断指针内的是否符合要求。 这个题为了能快速判断是否有这个数,可以用STL中的set。 代码如下: #include <iostream>#include <cstdio>#include <string>#include <cstring>#include <stdlib.h>#include

(白书训练计划)UVa 11054 Wine trading in Gergovia(等价转换)

题目地址:UVa 11054 很巧妙的一道题,这题是利用的等价转换,对每一条路来说,假如右边生产的比左边的多x,那么不管起点是哪,终点是哪,都可以把左右两侧的看成两个点,要从这条路上运送x个劳动力。再由于总和是0,所以只需要算出一端的总和就可以,这样只要遍历一遍就可以算出来了。写出代码就很简单了。。。 代码如下: #include <iostream>#include <stdio.h

(白书训练计划)UVa 1152 4 Values whose Sum is 0(中途相遇法。。)

题目地址:UVa 1152 先枚举A集合与B集合的和,存起来,然后再枚举C集合与D集合的和,看与存起来的值有多少个是互为相反数的。水题。找存起来的值时可以用二分找。 代码如下: #include <iostream>#include <cstdio>#include <string>#include <cstring>#include <stdlib.h>#include <m

【白书】第一章习题

#include <stdio.h>int main(){int a = 0,b = 0,c = 0;float ave = 0;printf ("输入3个整数:");scanf ("%d %d %d",&a,&b,&c);ave = (float)(a + b + c) / 3;printf ("AVE = %.3f",ave);return 0;} #include <stdio.h

【白书习题】数的反转

题目描述 输入一个整数,你所需要做的是将其反转,输出的仍然是一个整数 输入描述 第一行N表示将会有几个测试数据(N<=100);接下来的N行每行一个整数(每行得整数不超过100000000000)。 输出描述 输出反转之后的整数,每行一个。 样例输入 1 127 样例输出 721 示例代码: #include<iostream>using namespace std;int mai

白书若干题

1. P32(排列)    用1、2、3、…、9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。输出所有解。 int i,j,k;for(i=123; i<=987/3; i++){j = 2*i;k = 3*i;//然后判断ijk是否满足条件(1到9不重不漏) } next_permutation等全部重拍,然后判断是否满足比例