/*
题意:一组单词,是否可以分解成两个单词
思路:可以进行重组(一种时间效率为n,但空间分配为n*n,一种时间效率为n*n,空间分配为n)
也可以进行分拆,效率为n*m,其中m为单词平均长度。
主要学习:字符串的哈希处理
另外看别人的代码学习到的新技巧:
char str[n][m];
int r[n];
借助r来实现对str的排序。
步骤:
for(int i=0;i<n;i++)
r[i]=i;
qsort(r,n,sizeof(r[0]),cmp);
for(int i=0;i<n;i++)
printf("%s\n",str[r[i]]);
其中:
int cmp(const void *a,const void *b)
{
int *pa=(int *)a;
int *pb=(int *)b;
return strcmp(str[pa],str[pb]);
}
*/
#include <cstdio>
#include <cstring>
const int nMax=120007;
int head[nMax],next[nMax];
char str[nMax][100];
int hash(char *a)
{
int u=0;
while(*a)
{
u=u*26+*a;
a++;
}
return (u & 0x7fffffff)%nMax;
}
void insert(int k)
{
int h=hash(str[k]);
next[k]=head[h];
head[h]=k;
}
bool search(char *a)
{
int h=hash(a);
int ok=false;
for(int i=head[h];i!=-1;i=next[i])
if(strcmp(str[i],a)==0)
{
ok=true;
break;
}
return ok;
}
int main()
{
//freopen("data.in","r",stdin);
int n=0;
memset(head,-1,sizeof(head));
while(gets(str[n]))
{
insert(n);
n++;
}
for(int i=0;i<n;i++)
{
for(int j=1;j<strlen(str[i]);j++)
{
char str1[100],str2[100];
memset(str1,0,sizeof(str1));
memset(str2,0,sizeof(str2));
strncpy(str1,str[i],j);
strncpy(str2,str[i]+j,strlen(str[i])-j);
if(search(str1) && search(str2))
{
printf("%s\n",str[i]);
break;//原来这里忘了跳出,一直WA。正所谓细节决定成败!
}
}
}
return 0;
}
10391 - Compound Words(***)字符串的哈希函数
本文探讨了一种通过哈希处理来解决字符串重组问题的方法,包括如何高效地判断一组单词能否被分解为两个子单词。文章还介绍了字符串哈希处理的基础知识及其实现技巧。

被折叠的 条评论
为什么被折叠?



