又是一篇血泪史.
这个题目和POJ1002是差不多的,先前已经做过一遍
大概半个小时后就完成了..
但是以为跟POJ上的一样,要处理Q和Z..就又折腾了一些时间.
折腾来折腾去不管怎么提交都是WA...推敲了好几遍我的思路,确认是没有问题的..于是就去睡觉了..
但是一道题目没解决..觉也睡不好.于是早上六点就醒了,又重新看了一遍程序.还是没有头绪,总感觉输出有问题..
于是又看了好几遍,才发现循环输出的时候多输出了一位
果然每次到数组就要死一次
思路就是把每个输入先存到buf数组里,再转化为数字存到二维数组里,用qsort排序,然后计数输出.
注意数组的临界.
PS:UVA这题根本不用考虑输入包括Q和Z时候的情况..而且题目里明明说了Excluding Q and Z.而POJ....╮(╯▽╰)╭
#include
#include
#include
#include
int Search(char c);
int comp(const void *_a, const void *_b)
{
char *a = (char *) _a;
char *b = (char *) _b;
return strcmp(a,b);
}
char word[110000][300];
char buf[300];
char str1[] = "ABCDEFGHIJKLMNOPRSTUVWXY";
char str2[] = "222333444555666777888999";
int main()
{
//freopen("input.txt", "r", stdin);
int flag = 0;
int i, j, T, n, k = 0, k1 = 0;
int count = 1;
scanf("%d", &T);
while (T--)
{
count = 1;
k1 = 0;
flag = 0;
memset(word, 0, sizeof(word));
scanf("%d", &n);
getchar();
for (i = 0; i < n; i++) //依次读取字符串.
{
k = 0;
memset(buf, 0, sizeof(buf));
gets(buf);
for (j = 0; j < strlen(buf); j++) //把缓冲数组中的字符转化并存入正式数组
{
if (buf[j] == '-')
continue;
else
{
if (isalpha(buf[j]))
{
int a = Search(buf[j]); //查找当前字母所代表的数字.
word[i][k++] = str2[a];
}
else
word[i][k++] = buf[j];
}
}
}
//读取完毕,下面进行排序.
qsort(word, n, sizeof(word[0]), comp);
for (i = 0; i < n - 1 ; i++)
{
if (!strcmp(word[i], word[i + 1]))
{
count++;
}
else
{
if (count > 1)
{
flag = 1;
printf("%c%c%c-%c%c%c%c %d\n", word[i][0],word[i][1],word[i][2],word[i][3],word[i][4],word[i][5],word[i][6], count);
count = 1;
}
}
if (!strcmp(word[i], word[i + 1]) && i == n - 2)
{
if (count > 1)
{
flag = 1;
printf("%c%c%c-%c%c%c%c %d\n", word[i][0],word[i][1],word[i][2],word[i][3],word[i][4],word[i][5],word[i][6], count);
count = 1;
}
}
}
if (flag == 0)
{
printf("No duplicates.\n");
}
if (T >= 1)
printf("\n");
}
}
int Search(char c)
{
for (int i = 0; i < strlen(str1); i++)
{
if (str1[i] == c)
return i;
}
}