略坑
有空行,要用gets输入。
然后避免多次strcpy和使用高效哈希函数,避免超时。
高效字符串哈希:
inline int hash(char *str){ // 字符串哈希函数
int seed = 131;
int hash=0;
while(*str) hash = hash * seed + (*str++);
return (hash & 0x7FFFFFFF) % HashSize;
}
完整代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAX 3000
#define HASHSIZE 10000000
using namespace std;
char a[MAX][15],b[MAX][15],s[MAX*MAX][30];
int M,N,all,head[HASHSIZE],next[MAX*MAX];
int hash(char *str){
int seed=131, v=0;
while(*str) v = v*seed + (*str++);
return (v & 0x7FFFFFFF)%HASHSIZE;
}
int insert(int aa,int bb,int cc)
{
s[cc][strlen(a[aa])]=0;
strcat(s[cc],b[bb]);
int hashvalue=hash(s[cc]);
int u=head[hashvalue];
while(u!=-1)
{
if(strcmp(s[u],s[cc])==0)
return 0;
u=next[u];
}
next[cc]=head[hashvalue];
head[hashvalue]=cc;
return 1;
}
void solve()
{
int i,j;
memset(head,-1,HASHSIZE*4);
memset(next,-1,MAX*MAX*4);
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
strcpy(s[all],a[i]);
if(insert(i,j,all))
all++;
}
}
}
int main()
{
int t,i,j;
scanf("%d",&t);
for(i=1;i<=t;i++)
{
all=0;
scanf("%d %d%*c",&M,&N);
for(j=0;j<M;j++)
{
gets(a[j]);
}
for(j=0;j<N;j++)
{
gets(b[j]);
}
solve();
printf("Case %d: %d\n",i,all);
}
return 0;
}