hdu 1113

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1113

题意:给一堆单词做字典,XXXXXX结束。然后给若干个单词,输出它和字典里哪些单词由同样的字母(个数也相同)组成,有多组的话按字典序输出。XXXXXX结束。

mark:题意有点绕。。。思路是先把字典里的单词排序,并且每个单词计算一个值val。这个val是把单词的字母排序以后hash得到的,范围是26^6也就是3亿多一点,可以用int来表示。这样接下来每个单词输入的时候,只要比对字典里的val,相同则可以输出。不hash的话就多存一个字母排序以后的单词也可以。

代码:

# include <stdio.h>
# include <string.h>
# include <stdlib.h>


typedef struct NODE{
char str[10] ;
int len, val ;
}NODE ;


NODE dp[110] ;


int scmp(const void *a, const void *b)
{
return *(char*)a - *(char*)b ;
}


int calc(char *str, int len)
{
int rtn = 0 ;
qsort(str, len, 1, scmp) ;
while (len--)
{
rtn = rtn * 27 + str[0] ;
str++ ;
}
return rtn ;
}


int cmp( const void *a, const void *b)
{
NODE *p = (NODE*)a, *q = (NODE*) b ;
return strcmp(p->str, q->str) ;
}


int main ()
{
int n, i = 0, flag ;
char str[10] ;

while (gets(str) && strcmp(str, "XXXXXX"))
{
strcpy (dp[i].str, str) ;
dp[i].len = strlen(str) ;
dp[i].val = calc(str, dp[i].len) ;
i++ ;
}
n = i ;
qsort(dp, n, sizeof(NODE), cmp) ;
while (gets(str) && strcmp(str, "XXXXXX"))
{
flag = 0 ;
for (i = 0 ; i < n ; i++)
{
if (strlen(str) == dp[i].len &&
calc(str, dp[i].len) == dp[i].val)
{
puts (dp[i].str) ;
flag = 1 ;
}
}
if (flag == 0) puts ("NOT A VALID WORD") ;
puts ("******") ;
}
return 0 ;
}



原文地址:https://www.cnblogs.com/lzsz1212/p/2336425.html