2012年2月5日
摘要: SPOJ_220 这个题目和POJ_1743很像,POJ那个题是去找最长的不重叠的重复字串,而这个题目是要求找到一个字符串,使得其是各个字符串的最长的不重叠的重复字串。 因此,整体的思路还是基本相同的。首先要将若干字符串合并成一个字符串并用分隔符隔开。然后二分所求字符串的长度k,并顺序遍历height数组,将相邻的值不小于k的height[]分成一组,对于组内的后缀按首字符所在的字符串的不同,一一去判断sa[]的最大值和最小值之差是否不小于k,如果不小于k就说明在这个字符串中存在长度为k的不重叠的且至少出现两次的子串。#include<stdio.h>#include<str 阅读全文
posted @ 2012-02-05 13:28 Staginner 阅读(329) 评论(0) 推荐(0) 编辑
摘要: POJ_1226 这个题目可以枚举长度最小的字符串的所有子串,然后暴搜。但为了练一练后缀数组,所以就用后缀数组写了。#include<stdio.h>#include<string.h>#define MAXD 20100char b[110];int N, M, h[110], f[MAXD], r[MAXD], rank[MAXD], sa[MAXD], height[MAXD], ws[MAXD], wv[MAXD], wa[MAXD], wb[MAXD];void init(){ int i, j, k, x = 128; k = 0; for(i = 0; i 阅读全文
posted @ 2012-02-05 02:09 Staginner 阅读(305) 评论(0) 推荐(0) 编辑