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;
}