思路:假设小西字符串为str1[i] , 小明的字符串为str2[j] 遍历一次str1[i] ,查看对于每一个str1[i] 是否有str2[j] == str1[i] 或者 hash[str2[j]][str1[i]] == 1若都存在则输出happy, 否则输出unhappy.
注意:每一个输入后要加一个getchar(); 这点wrong了好几次
#include <iostream>
using namespace std;
#define N 1100
char str1[N];
char str2[N];
int m_hash[27][27];
int main()
{
int i, j,t, n1, n2, m, k = 1;
char a, b;
scanf("%d", &t);
while(t--)
{
getchar();
gets(str1);
gets(str2);
scanf("%d", &m);
memset(m_hash, 0, sizeof(m_hash));
for (i = 0;i < m; ++i)
{
getchar();
scanf("%c %c", &a, &b);
m_hash[a - 'a'][b - 'a'] = 1;
}
n1 = strlen(str1);
n2 = strlen(str2);
for(i = 0, j = 0;i < n1 && j < n2; )
{
if (str1[i] == str2[j])
{
++j;
++i;
continue;
}
else
{
while(j < n2)
{
if (str1[i] == str2[j] || m_hash[str2[j] - 'a'][str1[i] - 'a'] == 1)
{
++j;
++i;
break;
}
else
{
++j;
}
}
}
}
if (i == n1)
{
printf("Case #%d: happy\n", k++);
}
else
{
printf("Case #%d: unhappy\n", k++);
}
}
return 0;
}