UVa 755 487-3279

本文深入探讨了信息技术领域的多个方面,包括开发工具、嵌入式硬件、音视频基础、AI音视频处理等细分技术领域。文章详细介绍了各领域的关键概念、应用实例和技术趋势,旨在为读者提供全面的技术洞察与实践指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:对每组数据把每个字符转换为相应的数字,并加入-,保存于一个字符串中。最后得到的是一个字符串数组,对该数据排序,相邻的判断即可~(排序后相邻判断这样的思路,前面做过好几个题了。)(此题对于我来说,主要是我对输入数据的理解有点紊乱,它是多组数据,而只有最后一组数据才遇到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);   
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值