poj 1002 487-3279

Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 135796 Accepted: 23073

    这道题总的来说是不难,就是对字符串的处理,不过有一点的记着,缓冲数组必须开的大一点,我就在这上面吃过苦头了,交了几次全Wrong了。后来看了别人的讨论才知道数组最少开到50。

   思想:将接收到得字符串进行处理,使正常化之后,再对他们进行排序(本来我是想一个一个的匹配然后用一个数组记录下相同字符串并用一个字符串记录相同的个数,后来发现还是这个方法比高明),排序之后相同的肯定排在一起,然后对相邻的两个字符串进行比较,如果相等让i++,if(i-j)>1表名有重复的字符串,此时对本字符串输出,并输出重复的个数i-j.

代码:

 

  
    
1 #include < stdio.h >
2 #include < string .h >
3 #include < stdlib.h >
4   char b[] = " 22233344455566677778889999 " ;
5   char c[ 10 ]; char d[ 100000 ][ 9 ];
6 int compare( const void * e1, const void * e2)
7 {
8 return strcmp(( char * )e1,( char * )e2);
9 };
10 void tran( char a[])
11 {
12 int i,j = 0 ;
13 for (i = 0 ;a[i] != ' \0 ' ;i ++ )
14 {
15 if (a[i] == ' - ' )
16 continue ;
17 if (a[i] >= ' A ' && a[i] <= ' Z ' )
18 c[j] = b[a[i] - ' A ' ];
19 else
20 c[j] = a[i];
21 j ++ ;
22 if (j == 3 )
23 {
24 c[j] = ' - ' ;
25 j ++ ;
26 }
27 }
28 c[j] = ' \0 ' ;
29 }
30
31 int main()
32 {
33 int i,j;
34 char a[ 50 ]; int n,count = 0 ,mark = 1 ,m;
35 scanf( " %d " , & n);
36 m = n;
37 while (m -- )
38 {
39 scanf( " %s " ,a);
40 tran(a);
41 strcpy(d[count ++ ],c);
42 }
43 qsort(d,n, sizeof (d[ 0 ]),compare);
44 for (i = 0 ;i < n;)
45 {
46 j = i;
47 i ++ ;
48 while (strcmp(d[i],d[j]) == 0 && i < n)
49 i ++ ;
50 if (i - j > 1 )
51 {
52 printf( " %s %d\n " ,d[j],i - j);
53 mark = 0 ;
54 }
55 }
56 if (mark)
57 printf( " No duplicates.\n " );
58
59 return 0 ;
60 }
61
62

 

你可能感兴趣的:(poj)