今天发现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,害死我了 */
