这个题,,,无语了,各种错误十几遍。
1.不能用scanf读单词,因为可能会有空串(虽然题目中没有说)
2.惯用的一种方式,scanf("%d%d\n",&m,&n);gets(str);本以为这样会避免了gets读取空格,但是提交后会WA,!!!教训
3.读取完第一种单词后,在读取第二种单词时,每读一个就和第一种单词组合(按题目要求,第一种单词在前,第二种在后),本以为这样会节省一点时间,但是TLE,不知道为什么。然后改成两种单词分别读完后,再用两个循环判断,这样就过了。
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
using namespace std;
int main()
{
//freopen("in.txt","r",stdin);
int cas,m,n;
map<string,int>vis;
char str1[1510][15],str2[1510][15];
//char str[50];
string str;
scanf("%d",&cas);
for(int k=1; k<=cas; k++)
{
scanf("%d%d",&m,&n);
getchar();//若直接写scanf("%d%d\n",&m,&n);会WA
vis.clear();
for(int i=0; i<m; i++)
gets(str1[i]);
/*for(int i=0; i<n; i++)
{
gets(str2);
for(int j=0;j<m;j++)
{
//str=str1[j];
//str+=str2[i];
strcpy(str,str1[j]);
strcat(str,str2);
if(vis[str]==0)
vis[str]=1;
}
}*//这样写会TLE
for(int i=0; i<n; i++)
gets(str2[i]);
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
str=str1[i];
str+=str2[j];
//strcpy(str,str1[i]);
//strcat(str,str2[j]);
//printf("%s\n",str);
if(vis[str]==0)
vis[str]=1;
}
}
printf("Case %d: %d\n",k,vis.size());
}
return 0;
}