UVaOJ10282
这个题,很多种方法,不过用哈希表来做会更快一些,有人用map做,我觉得也很不错,主要是容易写。
1 -映射-> 2
map 是映射,直接将map 设置成 map <string,string> 变量名;map[st1] = st2 。(st1 --〉 st2 )用map.find(st1),若返回为1,则找到。0则没有找到。
还有一个是 哈希表,注意小细节,如果从0开始储存字符串,那么str[0]在表上就存不上去,要从一开始。
next[k] = head[h];
head[h] = k;
刚开始存储 第0个下标,next[0] = 0. 那么在查找时:
int u = head[h];
while(u)
{
...;
}
u =head[0],u=0,就跳过循环了。从0下标开始的第一个字符串就 输不出结果了。
还有一个编程的细节,就是最后要输出的那个循环,也要控制不要无限输入。否则 OJ上还有一种 检测结果叫 "Output limit exceeded" .
--------------------------------------------------------------------------
#include<stdio.h> #include<string.h> int head[1000003],next[1000000]; char str[100000][30]; char st1[11],st2[11]; int hash( ) { int sum = 0,i=0; while(i< strlen(st2) ) { sum = sum*131 + st2[i++]; } return (sum & 0x7FFFFFFF) % 1000003; } void add_hash( int k ) { int h = hash(); next[k] = head[h]; head[h] = k; } int search_hash( ) { int h = hash(); int u = head[h]; int i,j; while(u) { for(i= 0;i<strlen(str[u]);i++) if(str[u][i] == ' ')break; i++; for(j=0;i<strlen(str[u])&& j<strlen(st2);j++,i++) if(str[u][i] != st2[j])break; if(i==strlen(str[u]) && j ==strlen(st2)) return u; u = next[u]; } return 0; } int main() { int i,j , res; int now = 1; memset(head,0,sizeof(head)); while(1) { gets(str[now]); if(str[now][0] =='\0')break; for(i=0;i< strlen(str[now]);i++) { if(str[now][i]==' ')break; st1[i] = str[now][i] ; } st1[i] = '\0'; i++; for(j=0;i< strlen(str[now]);j++) st2[j] = str[now][i++]; st2[j] ='\0'; add_hash( now ); now++; } while(gets(st2)) { if(st2[0]=='\0')break; res = search_hash(); if(res) { for(i=0;i<strlen(str[res]);i++) { if(str[res][i]==' ')break; printf("%c",str[res][i]); } } else printf("eh"); printf("\n"); } return 0; }