思路:对每组数据把每个字符转换为相应的数字,并加入-,保存于一个字符串中。最后得到的是一个字符串数组,对该数据排序,相邻的判断即可~(排序后相邻判断这样的思路,前面做过好几个题了。)(此题对于我来说,主要是我对输入数据的理解有点紊乱,它是多组数据,而只有最后一组数据才遇到EOF,而且此题的最后一组数据的最后一行其实是有换行符的,而我竟然直接来一个while循环里判断EOF,明显错啊~可能做题时没专心,下次做题还是要专心,AC了后才干其他事吧~)
注意:1.在用getchar()处理一行和到文件尾时有些模糊,最开始我写的好像是while的判断条件是!=EOF,而其实只有最后一组数据才会遇到EOF的。这样好像会导致RE错误。(遇到RE错误时,还以为是开了太大的数据,就把int cs[100010]给注释掉而用一个变量cnt来处理了。结果还是RE)上一题好像就也是这样错过,把while的条件前面加上了一个次数判断,当时没太注意,没有及时总结。或者可以用for循环判断次数、内部用while循环遇到‘\n‘的风格,而且从AC的代码来看,此题应该是都有‘\n‘(包括最后一行),不会直接就EOF。
2.转换的问题,用另一种方法可能更好。char convert[ 30 ] = "2223334445556667777888999"; s[ p ][ j++ ] = convert[c-‘A‘]; 注意这里的convert数组是4个7,因为要忽略Q、Z,Z没影响。这是借鉴别人的方法,感觉思路很好,当时写if-else的时候就虽然可以复制、修改但还是感觉很麻烦,就在想有没有简洁的方法,果然~
另外在输出时,可以在qsort后多来一个字符串,即strcpy一个不会出现的字符串过去,在输出的时候就直接判断到<n-1就行了,循环后面不用再加。不过只要记着循环后要加最后一个数据也是一样的~
版本2是对上述几点修改后的代码~
另:RE可能是死循环一直等待读入(比如在while循环里用getchar判断结束时,如果你用的是!=‘\n‘,而输入的最后一行是eof而没有换行符,那么就会RE)
我这题的RE错误是,while循环里用!=EOF判断,而输入数据只有最后一组才遇到EOF,所以多于一组数据时,就出错,RE。。。
写得有点乱,有点啰嗦~
Code:
//#define LOCAL
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 100010
int cmp_str(const void *_a, const void *_b);
char dic[N][10];
//int cs[N];
int main()
{
#ifdef LOCAL
freopen("data755.in","r",stdin);
freopen("data755.out","w",stdout);
#endif
int num=0;
scanf("%d",&num);
while(num-->0)
{
int n=0;
scanf("%d",&n);
char c;
int h=0,ln=0;
getchar();//又忘了~
//printf("n:%d\n",n);
//while(x<n && (c=getchar())!=EOF)
while(h<n)
{
c=getchar();
if(c!=‘-‘&&c!=‘\n‘&&c!=EOF)
{
if(c==‘A‘||c==‘B‘||c==‘C‘) { dic[h][ln++]=‘2‘; if(ln==3) dic[h][ln++]=‘-‘;}
else if(c==‘D‘||c==‘E‘||c==‘F‘) { dic[h][ln++]=‘3‘; if(ln==3) dic[h][ln++]=‘-‘;}
else if(c==‘G‘||c==‘H‘||c==‘I‘) { dic[h][ln++]=‘4‘; if(ln==3) dic[h][ln++]=‘-‘;}
else if(c==‘J‘||c==‘K‘||c==‘L‘) { dic[h][ln++]=‘5‘; if(ln==3) dic[h][ln++]=‘-‘;}
else if(c==‘M‘||c==‘N‘||c==‘O‘) { dic[h][ln++]=‘6‘; if(ln==3) dic[h][ln++]=‘-‘;}
else if(c==‘P‘||c==‘R‘||c==‘S‘) { dic[h][ln++]=‘7‘; if(ln==3) dic[h][ln++]=‘-‘;}
else if(c==‘T‘||c==‘U‘||c==‘V‘) { dic[h][ln++]=‘8‘; if(ln==3) dic[h][ln++]=‘-‘;}
else if(c==‘W‘||c==‘X‘||c==‘Y‘) { dic[h][ln++]=‘9‘; if(ln==3) dic[h][ln++]=‘-‘;}
else { dic[h][ln++]=c; if(ln==3) dic[h][ln++]=‘-‘;}
}
else if(c==‘\n‘||c==EOF)
{
dic[h][ln]=‘\0‘;
h++;ln=0;
}
}//while
qsort(dic,h,sizeof(dic[0]),cmp_str);
//for(int i=0;i<h;++i)
// printf("%s\n",dic[i]);
int cnt=1;
bool flag=0;
for(int i=0;i<h-1;++i)
{
if(strcmp(dic[i],dic[i+1])==0) //{ cs[i+1]=cs[i+1]+cs[i]; cs[i]=0;}
{ cnt++; flag=1;}
else
{
if(cnt>1) printf("%s %d\n",dic[i],cnt);
cnt=1;
}
}
if(cnt>1) printf("%s %d\n",dic[h-1],cnt);//不要忘了这个
if(flag==0) printf("No duplicates.\n");
if(num) printf("\n");
}
//system("pause");
return 0;
}
int cmp_str(const void *_a, const void *_b)
{
char *a=(char*)_a;
char *b=(char*)_b;
return strcmp(a,b);
}
版本2
//两个版本都可AC //版本2 把之前想修改的地方修改了。 //#define LOCAL #include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> #define N 100010 int cmp_str(const void *_a, const void *_b); char dic[N][10]; char convert[]="2223334445556667777888999"; int main() { #ifdef LOCAL freopen("data755.in","r",stdin); freopen("data755.out","w",stdout); #endif int num=0; scanf("%d",&num); while(num-->0) {//一组数据 int n=0; scanf("%d",&n); char c; getchar();//又忘了~ for(int h=0;h<n;++h) {//n个号码 int ln=0; while((c=getchar())!=‘\n‘) {//一行 if(isalpha(c)) { dic[h][ln++]=convert[c-‘A‘]; if(ln==3) dic[h][ln++]=‘-‘; } else if(c!=‘-‘) { dic[h][ln++]=c; if(ln==3) dic[h][ln++]=‘-‘; } }//while dic[h][ln]=‘\0‘; }//for qsort(dic,n,sizeof(dic[0]),cmp_str); strcpy(dic[n++],"X"); int cnt=1; bool flag=0; for(int i=0;i<n-1;++i) { if(strcmp(dic[i],dic[i+1])==0) { cnt++; flag=1;} else { if(cnt>1) printf("%s %d\n",dic[i],cnt); cnt=1; } } if(flag==0) printf("No duplicates.\n"); if(num) printf("\n"); } //system("pause"); return 0; } int cmp_str(const void *_a, const void *_b) { char *a=(char*)_a; char *b=(char*)_b; return strcmp(a,b); }
UVa 755 487-3279,布布扣,bubuko.com
原文:http://blog.csdn.net/buxizhizhou530/article/details/21838737