数学_大数求模(HDU_1021)
摘要:公式: (a+b)%k = (a%k + b%k)%k (a-b)%k = (a%k - b%k)%k#include #include #define M 1000000#define MOD 3int map[M] = {7,11};void init(){ for(int i=2; i<M; i++) { map[i] = (map[i-2] % MOD + map[i-1] % MOD) % MOD; }}int main(int argc, char* argv[]){ #ifdef __MYLOCAL freopen("in.txt"...
阅读全文
posted @
2013-07-31 19:39
lk1993
阅读(175)
推荐(0)
模拟_预处理(HDU_2132)
摘要:注意 i*i*i 会越界,应定义为 __int64#include #include #define M 100002__int64 map[M] = {0,1};void init(){ for(__int64 i=2; i=0) { printf("%I64d\n",map[n]); } return 0;}
阅读全文
posted @
2013-07-31 19:16
lk1993
阅读(112)
推荐(0)
模拟_大数字符串(HDU_2054)
摘要:这道题以前写过,代码啰嗦,现重写特殊情况:1: 000 0000002: +000 -000003:000.00000 -000.000004:+000.00000 -000.000005: 0000123.4560000 -123.456。。。。。#include #include #define M 100000char A[M],B[M];void conv(char *&pD){ char flag = '*'; if(*pD == '+' || *pD == '-') { flag = *pD; pD++; } while(*p
阅读全文
posted @
2013-07-31 10:50
lk1993
阅读(169)
推荐(0)
DP_字串匹配(HDU_1501)
摘要:最优子结构分析:如果A、B可以组成C,C最后一个字母必定是A或B的最后一个字母组成。C去除除最后一位,变成是否可以求出A-1和B或A和B-1是否可以构成C-1状态转移方程:用f[i][j] 表示A前 i 位和B前 j 位是否可以组成C的前i+j位 dp[i][j] = (dp[i-1][j] && A[i]==C[i+j]) || (dp[i][j-1] && B[j]==C[i+j])#include #include #define M 202char A[M],B[M],C[M*2];int dp[M][M];int run(){ scanf("
阅读全文
posted @
2013-07-31 09:44
lk1993
阅读(175)
推荐(0)
动态字典树_字串标记查找+大数(HDU_4099)
摘要:#include #include #include using namespace std;#define MU 10#define WLEN 100#define M 100000struct node{ int id; node *child[MU]; node() { id = -1; memset(child,NULL,sizeof(child)); }};char fnMap[3][WLEN] = {"1","1"};void clear(node *root){ for(int i=0; ichild[i] != N...
阅读全文
posted @
2013-07-30 19:07
lk1993
阅读(193)
推荐(0)
动态字典树_字串查找匹配(HDU_1075)
摘要:#include #include #define M 3002#define MU 26#define WLEN 12struct node{ char to[WLEN]; node *child[MU]; node() { to[0] = '\0'; memset(child,NULL,sizeof(child)); }};char getTr[M],findEd[WLEN];void clear(node *root){ for(int i=0;ichild[i] != NULL) clear(root...
阅读全文
posted @
2013-07-27 15:00
lk1993
阅读(232)
推荐(0)
动态字典树+DFS(HDU_1298)
摘要:#include #include #define MU 26#define WLEN (100 + 2)struct node{ int pr; node *child[MU]; node() { pr = 0; memset(child,NULL,sizeof(child)); }};char findStr[WLEN],temp[WLEN];char findMap[][5] = {"","","abc","def","ghi","jkl","mno"
阅读全文
posted @
2013-07-27 13:41
lk1993
阅读(198)
推荐(0)
动态字典树_拆分查找(HDU_1247)
摘要:#include #include #define M 26#define WordSize 32#define WordCount 50000struct node{ int end; node *child[M]; node() { end = 0; memset(child,NULL,sizeof(child)); }};char map[WordCount][WordSize];void insert(node *root, char *str){ node *p = root; int len = strlen(s...
阅读全文
posted @
2013-07-22 22:06
lk1993
阅读(215)
推荐(0)
动态字典树_统计前缀子串(HDU_1251)
摘要:#include #include #define M 26struct node{ int count; node *child[M]; node() { count = 0; memset(child,NULL,sizeof(child)); }};void clear(node *root){ for(int i=0; ichild[i] != NULL) clear(root->child[i]); } delete root;}void insert(node *root, char *...
阅读全文
posted @
2013-07-22 21:11
lk1993
阅读(215)
推荐(0)
动态字典树_统计子串(HDU_2846)
摘要:解题思路:这一题要求我们找到输入的词是字典中多少个词的子串,而不仅仅是其前缀,因此建树的时候需要将词典中词分解成不同前缀加入到树中,即是说将形如abc的词拆成abc,bc,c,三种形式,这样就相当于找输入的词是词典中多少词的前缀,需要注意的是,对于同一个词分解出的多个前缀,如果他们之间有相同的话,这种前缀,只算作一种,即是说形如abca之类的词,会分解出abca,a两种前缀,但因为是同一个词分解出来的,所以算作一种。判断是否是同一个词分解出来的需要给每个输入的词及其分解出的前缀加以相同的id进行编号。#include #include #define M 26struct node{ i...
阅读全文
posted @
2013-07-22 20:35
lk1993
阅读(338)
推荐(0)
字典树讲解
摘要:Trie树也叫字典树,是一种用于快速检索的多叉树结构。如英文字母的字典树是一个26叉树。数字的字典树是一个10叉树。Trie树把要查找的关键词看作一个字符序列,并根据构成关键词字符的先后顺序构造用于检索的树结构;一棵m度的Trie树或者为空,或者由m棵m度的Trie树构成。特别的:和二叉查找树不同,在Trie树中,每个结点上并非存储一个元素。在Trie树中查找一个关键字的时间和树中包含的结点数无关,而取决于组成关键字的字符数。特点:①利用串的公共前缀->节约内存。②根结点(root)不包含任何字母。③其余结点仅包含一个字母(非元素)。④每个结点的子结点包含字母不同。查找过程:①在Trie
阅读全文
posted @
2013-07-22 19:23
lk1993
阅读(239)
推荐(0)
动态字典树_前缀相互查找(HDU_1671)
摘要:/*注意: 911911123这组数据可以得到正确的答案 911123 911对于这组数据就判断失误了用一个标记变量flag来标记插入过程中是否有重新创建节点*/#include #include #include #define M 10struct node{ int end; node *child[M]; node() { end = 0; memset(child,NULL,sizeof(child)); }};void clear(node *root){ for(int i=0;ichild[i] != NULL) ...
阅读全文
posted @
2013-07-22 19:17
lk1993
阅读(160)
推荐(0)
DP_基本DP+排序(HDU_1421)
摘要:#include #include #include using namespace std;#define MAX 0x7fffffff#define M (2000 + 5)#define ___min(a,b) (a < b ? a : b)#define __pow(a) ((a) * (a))int id[M],dp[M][M / 2];void run(){ int n,k; while(scanf("%d%d",&n,&k) != EOF) { for(int i=1; i<=n; i++) { ...
阅读全文
posted @
2013-07-17 20:59
lk1993
阅读(219)
推荐(0)
斯特灵公式
摘要:斯特灵公式斯特灵公式是一条用来取n阶乘近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特灵公式十分好用,而且,即使在n很小的时候,斯特灵公式的取值已经十分准确。公式为:这就是说,对于足够大的整数n,这两个数互为近似值。更加精确地:或者:求N!的位数:=log10(N!)+1 = 0.5*log10(2*PI*n)+n*log10(n/e);
阅读全文
posted @
2013-07-16 16:51
lk1993
阅读(375)
推荐(0)
七种 qsort 排序方法
摘要:七种 qsort排序方法 一、对 int 类型数组排序int num[100];Sample:int cmp ( const void *a , const void *b ){ return *(int *)a - *(int *)b;}qsort(num,100,sizeof(num[0]),cmp);二、对 char 类型数组排序(同 int 类型)char word[100];Sample:int cmp( const void *a , const void *b ){ return *(char *)a - *(char *)b;}qsort(word,100,sizeof(w..
阅读全文
posted @
2013-07-16 16:45
lk1993
阅读(238)
推荐(0)
sort 函数用法简介
摘要:STL中 sort函数用法简介 sort 函数,可以直接对数组排序,复杂度为 n*log2(n)。使用这个函数,需要包含头文件 #include 。这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址,排序的区间是[a,b)。例:对数组 t 的第 0 到 len-1 的元素排序,就写 sort(t,t+len)。对向量 v 排序也差不多, sort(v.begin(),v.end());排序的数据类型不局限于整数,只要是定义了小于运算的类型都可以,比如字符串类 string 。如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数
阅读全文
posted @
2013-07-16 16:44
lk1993
阅读(3868)
推荐(0)