6/44, Hamster, KMP

今天发现GNOME里面有一个叫做Hamster的好东西,应该说很适合我。它的中文名叫“时间追踪器”,可以追踪你每一分钟在做什么,玩游戏花了多少时间等等。(当然它不是自动的,需要你手工输入)这样,每天晚上我可以清晰地盘点一下一天都干了什么。

时间追踪器

今天看了些初赛题,还看了看KMP算法。说起KMP,就不得不提到Knuth这个我十分钦佩的人。今天就不说他了,以后有时间再说。KMP算法略难理解,于是今天下午我在机房给大家讲。说老实话,这个要讲出来确实不好讲,于是,我几乎是:“这个……恩,好像是这样的……哦,对不起,刚才说错了……”本来就麻烦的东西被我这么一折腾,大家都糊涂了。在此,我诚恳地向大家道歉。不过索性最后还是让大多数人明白了。为了某些管我要程序的人,我也贴贴代码。

#include <stdio.h>
#define MAX_STR_LEN 101
#define MAX_PATTERN_LEN 51
 
char str[MAX_STR_LEN];
char pattern[MAX_PATTERN_LEN];
int next[MAX_PATTERN_LEN];
 
void genNext();
int findPos();
 
int main()
{
	char ch;
 
	/* 输入主串和待匹配字符串 */
	printf("Enter string: ");
	str[0] = 0; /* str[0]存储字符串长度 */
	while((ch = getchar()) != '\n')
	{
		str[0]++;
		str[str[0]] = ch;
	}
	printf("Enter pattern: ");
	pattern[0] = 0; /* pattern[0]存储字符串长度 */
	while((ch = getchar()) != '\n')
	{
		pattern[0]++;
		pattern[pattern[0]] = ch;
	}
 
	genNext(); /* 生成待匹配字符串的next数组 */
 
	int pos;
	pos = findPos(); /* 开始匹配 */
	if(pos == 0)
		printf("Substr not found.\n"); /* 未找到 */
	else
		printf("Position: %d\n", pos);
 
	return 0;
}
 
void genNext()
{
	int i = 1, j = 0;
	next[1] = next[0] = 0;
	while(i < pattern[0])
	{
		if(j == 0 || pattern[i] == pattern[j]) {
			i++; j++; next[i] = j; }
		else
			j = next[j];
	}
}
 
int findPos()
{	
	int i = 1, j = 1;
	while(i <= str[0] && j <= pattern[0])
	{
		if(j == 0 || str[i] == pattern[j]) {
			i++; j++; }
		else
			j = next[j];
	}
 
	if(j > pattern[0])
		return i - pattern[0];
	else
		return 0;
}

今天Blog的评论达到100条(不含Spam),我决定开瓶鲜橙多庆祝一下。在此感谢所有支持我的Blog的人。

另:最近玩 Gnome方块 有点上瘾,得适可而止。/* 里面有一个阴冷的Bastard Mode,害死我了 */

Leave a Reply