2012年1月12日
摘要: POJ_2406 这个题目一开始AC的时候基本是YY出的,不过后来分析了一下这样确实可以。 我们先对字符串和它自己做KMP,实际上也就进行普通的KMP问题的预处理阶段,然后去找P[N],P[P[N]],…中是否存在一个值为k的元素使得N%(N-k)==0,其中N为字符串长度。如果找到了k,就输出N/(N-k)即可。当然,N=1时要分开来写。 至于为什么这样可以,还是举个例子来说明一下吧。不妨假设找到了这样的k,且N是N-k的x倍,于是我们就可以把字符串分成长度相等的x段,那么对应的匹配的情况就可以这样表示出来: 1 2 3 … x-1 x 1 2 … x-2 x-1 x 这样,那么根据... 阅读全文
posted @ 2012-01-12 23:29 Staginner 阅读(267) 评论(0) 推荐(0) 编辑
摘要: POJ_2513 这个题目实际上要求木棍能够组成一个欧拉道路即可。为了练字典树所以用字典树写的,当然,这个题目用哈希做也可以。 需要注意的是由于木棍有25W,因此不同的顶点最多有50W,所以存储图顶点的数组要开到50W。#include<stdio.h>#include<string.h>#define MAXN 500010#define MAXD 1000010#define D 500000int next[MAXD][26], flag[MAXD], r[MAXD], num[MAXN], p[MAXN], e, n;char b[15];void insert 阅读全文
posted @ 2012-01-12 20:49 Staginner 阅读(225) 评论(0) 推荐(0) 编辑
摘要: POJ_3630 为了练一下字典树所以做了这个题目,开数组的时候虽然号码只有10000个,但字典树的数字元素却一共可能有100000个。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXN 10010#define MAXD 100010char dig[MAXN][15];int len[MAXN], r[MAXN], N;int flag[MAXD], next[MAXD][10], e;int cmp(const void *_p, const void *_q){ int 阅读全文
posted @ 2012-01-12 17:36 Staginner 阅读(182) 评论(0) 推荐(0) 编辑
摘要: POJ_3461 今天开始学KMP啦,从gestapolur那里听说到Matrix67写的KMP通俗易懂,于是便去那里学了。http://www.matrix67.com/blog/archives/115#include<stdio.h>#include<string.h>#define MAXW 10010#define MAXT 1000010int N, P[MAXW];char word[MAXW], txt[MAXT];void prepare(){ int i, j; P[1] = j = 0; for(i = 2; word[i]; i ++) { .. 阅读全文
posted @ 2012-01-12 16:29 Staginner 阅读(153) 评论(0) 推荐(0) 编辑
摘要: HDU_1075 为了练习一下字典树所以做了一下这个题目。由于题目数据比较多,数组开小了会WA。#include<stdio.h>#include<string.h>#include<ctype.h>#define MAXD 500010char str[30], b[30], txt[3010], word[MAXD][12];int flag[MAXD], p[MAXD], next[MAXD][26], w, e;void insert(int cur, int k){ ++ e; flag[e] = 0; memset(next[e], 0, siz 阅读全文
posted @ 2012-01-12 14:53 Staginner 阅读(214) 评论(0) 推荐(0) 编辑