/*
题意:一组单词,是否可以分解成两个单词
思路:可以进行重组(一种时间效率为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;
}
第二次做:
#include <cstdio>
#include <cstring>
const int nMax=120000+10;
const int HASH=10000000;
char words[nMax][50];
int hash[HASH],next[HASH];
int get_hash(char word[])
{
int num,len;
len=strlen(word);
num=0;
for(int i=0;i<len;i++)
num=num*10+word[i];
return (num & 0x7fffffff)%HASH;
}
bool is_find(char a[])
{
int p=get_hash(a);
p=hash[p];
while(p!=-1)
{
if(strcmp(words[p],a)==0) return true;
p=next[p];
}
return false;
}
bool handle(int k)
{
int len=strlen(words[k]);
for(int i=1;i<len;i++)
{
char a[50],b[50];
strncpy(a,words[k],i);
a[i]=0;
strncpy(b,words[k]+i,len-i);
b[len-i]=0;
if(is_find(a) && is_find(b))
return true;
}
return false;
}
int main()
{
//freopen("f://data.in","r",stdin);
int n=0;
memset(hash,-1,sizeof(hash));
memset(next,-1,sizeof(next));
while(scanf("%s",words[n])==1)
{
int p=get_hash(words[n]);
next[n]=hash[p];
hash[p]=n;
n++;
}
for(int i=0;i<n;i++)
if(handle(i))
printf("%s\n",words[i]);
return 0;
}