这题的输入有点坑
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
const int maxn=1510;
int n,m;
char a[maxn][100],b[maxn][100],x[100];
int main()
{
//freopen("in.txt","r",stdin);
int t;
scanf("%d%*c",&t);
for(int cas=1;cas<=t;cas++)
{
scanf("%d%d%*c",&n,&m);
set<string> s;
for(int i=0;i<n;i++)
gets(a[i]);
for(int i=0;i<m;i++)
gets(b[i]);
for(int i=0;i<n;i++)
{
char tmp[300]={'\0'};
for(int j=0;j<m;j++)
{
strcpy(tmp,a[i]);
strcat(tmp,b[j]);
s.insert(string(tmp));
}
}
printf("Case %d: %d\n",cas,s.size());
}
return 0;
}
也可以用Trie树做
#include<stdio.h>
#include<string.h>
int head[10000017],next[3000000];
char st[3000000][25],b[25];
int hash(char *str)
{
int seed=31,v=0;
while(*str)
{
v=v*seed+*(str++);
}
return (v&0x7FFFFFFF)%10000017;
}
int insert(int s)
{
int i,h;
h=hash(st[s]);
for(i=head[h];i!=-1;i=next[i])
if(strcmp(st[i],st[s])==0)
break;
if(i==-1)
{
next[s]=head[h];
head[h]=s;
return 1;
}
else
return 0;
}
int main()
{
int i,j,k,M,N,ans,t,tt;
gets(b);
sscanf(b,"%d",&t);
for(tt=0;tt<t;tt++)
{
gets(b);
sscanf(b,"%d%d",&M,&N);
ans=0;
memset(head,-1,sizeof(head));
for(i=0;i<M;i++)
gets(st[i]);
for(j=0;j<N;j++)
{
gets(st[i]);
for(k=0;k<M;k++)
{
strcpy(st[i+k+1],st[k]);
strcpy(st[i+k+1]+strlen(st[i+k+1]),st[i]);
if(insert(i+k+1))
ans++;
}
i=i+M+1;
}
printf("Case %d: %d\n",tt+1,ans);
}
return 0;
}