poj 3320 Jessicas Reading Problem (哈希高级应用)

, Jerry

看了好几个小时 算法原理终于把这个题目搞掉了@!! 下面经哥哥详细注释:

#include<iostream>#include<sstream>#include<algorithm>#include<cstdio>#include<string.h>#include<cctype>#include<string>#include<cmath>#include<vector>#include<stack>#include<queue>#include<map>#include<set>using namespace std;const int PRIME = 99991;struct node //hash表结点元素包含三个属性 key表示结点元素值,num相当于hash表下标,{//next表示指向的下一个结点hash表下标int key,num;int next ;} p[10000005];int s[1000006];int len ,n,ans;int ELFhash(int k){int i = k% PRIME;while(p[i].next != -1){//i下标位置不为单一元素值,即以此元素为头结点有一条“拉链”里面//可能包含和头结点相同key值也可能不同,注意到此拉链是是按照递减顺序//插入的,所以如果k>p[p[i].next].key 即找到插入位置。且此时仍没有发现key// 值相同,所以需要为此k值在hash表中安排新的下标位if(k>p[p[i].next].key)break;else if(k == p[p[i].next].key)return p[i].next;// 如果发现相同返回hash表下标位i=p[i].next;// 沿着“拉链”继续查找}p[len].key=k;p[len].next = -1;p[len].num = 0;p[len].next = p[i].next;p[i].next = len;len++;//此六行是插入新元素值,注意是按照拉链递减规则插入return len -1 ;}int main(){int left,temp;while(scanf("%d",&n)!=EOF){memset(s,0,sizeof(s));for(int i=0; i<PRIME; i++)p[i].next = -1;len=PRIME;left = 0;//以上为初始化,,且left用于标记右端点下标的极值for(int i=0; i<n; i++){scanf("%d",&s[i]);temp = ELFhash(s[i]);p[temp].num++;if(p[temp].num<=1){//此条件下表示新元素插入ans代表最小串,其值必为下条语句ans = i-left+1;continue;}// 也就是说如果发现和前面有重复元素的时候temp = ELFhash(s[left]);while(left<n-1&&p[temp].num>1){//如果是和left位置元素相同left完全可以右移一个//往后只需研究left和i之间的元素,看看是否可以找到比//ans更小的值。p[temp].num–;left++;temp=ELFhash(s[left]);}if(ans>i-left+1)ans=i-left+1;//如果是和left和i之间不包含端点元素相同//左端点不能变,右端点i此时拉长一位 ,ans值不变}printf("%d\n",ans);}return 0;}

人生难免有挫折,但你是逃避不了的,一定要去面对它

poj 3320 Jessicas Reading Problem (哈希高级应用)

相关文章:

你感兴趣的文章:

标签云: