我们现在做一个单词游戏,游戏规则为将给定的一系列单词按照同构词(由相同字母组成,但可能顺序不同的单词)规则进行分组。例如:
eat tea tan ate nat bat
上述为5个单词,按照同构词的规则,我们可以将其分为三组
ate eat tea bat nat tan
现在请你编程实现同构词的分组。
输入
输入包含两行,第一行输入整数 n(1 ≤ n ≤ 50)表示单词的个数,第二行输入 n 个单词,单词间用空格分隔,每个单词由26个小写字母(a~z)组成,且每个单词的长度不超过10个字符。
输出
输出为分组后的单词,每组一行,组内及组间的单词顺序按字典序排列,如上述示例。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 1024KB | 0 |
#include<cstdio>//AC
#include<cstring>
#include<cstdlib>
int n, last = 0;
char str[65][25] = { '\0' }, str2[65][25] = { '\0' };
int num[65] = { -1 }, strnum[65][65] = { 0 };
int numm[65] = { 0 };
int cmp1(const void *a, const void *b)
{
return *(char *)a - *(char *)b;
}
void cmp2(void)
{
for (int i = 0; i < last; i++)
{
for (int j = 0; j < last - 1; j++)
{
int cm = strcmp(str[strnum[numm[j]][1]], str[strnum[numm[j+1]][1]]);
if (cm > 0)
{
int jh = numm[j];
numm[j] = numm[j + 1];
numm[j + 1] = jh;
}
}
}
}
void ZuSort(int last)
{
for (int i = 1; i <= strnum[last][0]; i++)
{
for (int j = 1; j < strnum[last][0]; j++)
{
int mm = strcmp(str[strnum[last][j]], str[strnum[last][j + 1]]);
if (mm > 0)
{
int xx = strnum[last][j];
strnum[last][j] = strnum[last][j + 1];
strnum[last][j + 1] = xx;
}
}
}
}
int main()
{
memset(num, -1, sizeof(num));
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%s", str[i]);
strcpy(str2[i], str[i]);
}
for (int i = 0; i < n; i++)
{
int len = strlen(str2[i]);
qsort(str2[i], len, sizeof(str2[i][0]), cmp1);
}
for (int i = 0; i < n; i++)//分组
{
if (num[i] < 0)
{
num[i] = 1;
int nn = 1;
strnum[last][nn] = i;
strnum[last][0] = 1;
for (int j = i + 1; j < n; j++)
{
if (num[j]<0)
{
int ans = strcmp(str2[i], str2[j]);
if (ans == 0)
{
nn++;
num[j] = 1;
strnum[last][nn] = j;
strnum[last][0]++;
}
}
}
last++;
}
}
for (int i = 0; i < last; i++)//组内排序
{
ZuSort(i);
}
for (int i = 0; i < last; i++)
numm[i] = i;//strnum[i] 'i'-->numm[i]
cmp2(); //组间排序
//输出顺序排序
for (int i = 0; i < last; i++)
{
for (int j = 1; j <= strnum[numm[i]][0]; j++)
{
if (j <= strnum[numm[i]][0] - 1)
printf("%s ", str[strnum[numm[i]][j]]);
else
printf("%s\n", str[strnum[numm[i]][j]]);
}
}
return 0;
}