上一页 1 ··· 45 46 47 48 49 50 51 52 53 ··· 85 下一页
  2012年1月13日
摘要: POJ_1204 其实POJ这个题目叙述得不太严谨,所以我就先做SPOJ上这个题去了,回来之后交了一下倒是也过了。这个题目可以用AC自动机去做,为了能够在匹配完单词后顺利找到单词首位置,我们可以选择把单词反过来建字母树,这样最后一个字符实际上就是第一个字符。 在后面查找的时候可以做一个小优化,就是找过的字典树上的结点的标记置为-1,以后再遇到这个结点就直接break而没必要再沿着预处理的标记向上寻找了。#include<stdio.h>#include<string.h>#define MAXD 800010#define MAXN 1010char b[MAXN][M 阅读全文
posted @ 2012-01-13 19:55 Staginner 阅读(327) 评论(0) 推荐(0) 编辑
摘要: HDU_2222 今天开始学AC自动机了,这个就是我AC自动机的处女作了。这个题有个小trick就是单词列表中可能有重复的单词,但这些重复的单词应看做不同的,因此建字典树时做标记的时候,把原来的赋值为1的操作变为自加1的操作即可。 最后匹配的时候有一个小优化,就是比如当前正在看有多少个以j结点的字符为结尾的单词,那么我们还需要不停地沿预处理的标记向上找,当我们找过之后就可以把当前节点的标记做成-1,以后再遇到-1的时候,就直接break,无需再沿着标记向上找了,因为上面的结点一定在之前就找过了。这个优化大概能节省400ms的时间。#include<stdio.h>#include& 阅读全文
posted @ 2012-01-13 16:16 Staginner 阅读(291) 评论(3) 推荐(0) 编辑
摘要: POJ_2752 将字符串对自己进行KMP匹配即可,也即进行一般的KMP问题的预处理的步骤。之后去找恰好匹配到最后一个字符的所有可能的前缀的长度即可,也就是遍历一遍P[N],其中N为字符串的长度。#include<stdio.h>#include<string.h>#define MAXD 400010char b[MAXD];int P[MAXD];void printresult(int k){ if(P[k] == 0) printf("%d", k); else { printresult(P[k]); printf(" %d... 阅读全文
posted @ 2012-01-13 00:07 Staginner 阅读(174) 评论(0) 推荐(0) 编辑
  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) 编辑
  2012年1月11日
摘要: SGU_114 这个题目乍看起来没什么思路,但如果随便挑一个点作为station,然后分别左右移动一下看看移动之后能够减少多少不满同时又会增加多少不满,思路便瞬间有了。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 15010int N, x[MAXD], p[MAXD], r[MAXD];long long int A[MAXD];int cmp(const void *_p, const void *_q){ int *p = (int *)_p; int *q = (i 阅读全文
posted @ 2012-01-11 23:06 Staginner 阅读(587) 评论(0) 推荐(0) 编辑
摘要: SGU_113 对数分解素因子即可,如果最后素因子的个数为1或者大于2自然无解。#include<stdio.h>#include<string.h>#include<math.h>#define MAXD 100010#define D 100000int isprime[MAXD];int N;void prepare(){ long long int i, j; memset(isprime, -1, sizeof(isprime)); for(i = 2; i < D; i ++) if(isprime[i]) for(j = i ... 阅读全文
posted @ 2012-01-11 22:09 Staginner 阅读(247) 评论(0) 推荐(0) 编辑
上一页 1 ··· 45 46 47 48 49 50 51 52 53 ··· 85 下一页