head的下标是哈希值,head[哈希值]=字符串的下标,拉链处理矛盾
要注意字符串哈希值的取法
#include<stdio.h> #include<string.h> char st[121000][30],temp[30]; int head[10000019],next[121000]; int hash(char *str) { int seed=31,v=0; while(*str) { v=v*seed+*(str++); } return (v&0x7FFFFFFF)%10000019; } void insert(int s) { int h; h=hash(st[s]); next[s]=head[h];//将s对应的hash中存的上一个结点放入next[s]中,把s放入下标为此hash值的head数组中,这样每个被挤出的点都被保存起来了 head[h]=s; } int search(char *str) { int i,h; h=hash(str); for(i=head[h];i!=-1;i=next[i]) if(strcmp(str,st[i])==0) break; if(i==-1) return 0; else return 1; } int main() { int i,j,k,n,ans; char t; n=0; memset(head,-1,sizeof(head)); while(gets(st[n])!=NULL) { insert(n); n++; if(st[n-1][0]=='1') break; } ans=0; for(i=0;i<n;i++) { k=strlen(st[i]); if(k<2) continue; strcpy(temp,st[i]); for(j=1;j<k;j++) { t=temp[j]; temp[j]='\0'; if(search(temp)&&search(&st[i][j])) { printf("%s\n",st[i]); break; } temp[j]=t; } } return 0; }