X.er86

导航

POJ_1002:487-3279

原题链接:http://poj.org/problem?id=1002

分类:字符串处理与哈希映射

算法:将字符串先转换为整数,将整数作为数组下标进行出现次数的统计,count数组开始初始化为0,统计整数的出现次数。

c++源代码:

 1 #include<iostream>
 2 #include<string>
 3 #include<cmath>
 4 
 5 using namespace std;
 6 
 7 long n;
 8 long count[10000000] = {0};
 9 
10 long change_s(string);
11 string change_long(long);
12 
13 int main()
14 {
15     cin >> n;
16     bool dup = false;
17     for (long i = 0; i < n; i++)
18     {
19         string tmp;
20         cin >> tmp;
21         long m = change_s(tmp);
22         count[m]++;
23         if (count[m] > 1) dup = true;
24     }
25     if (dup == false)
26         cout << "No duplicates." << endl;
27     else
28         for(long i = 0; i < 10000000; i++)
29             if (count[i] > 1)
30                 cout << change_long(i) << " " << count[i] << endl;
31     return 0;
32 }
33 
34 long change_s(string s)
35 {
36     long nn = 0;
37     long k = 0;
38     for (long i = s.length()-1; i >= 0; i--)
39     {
40         if (s[i] == 'A' || s[i] == 'B' || s[i] == 'C')
41             nn += 2 * pow(10.0,double(k++));
42         else if (s[i] == 'D' || s[i] == 'E' || s[i] == 'F')
43             nn += 3 * pow(10.0,double(k++));
44         else if (s[i] == 'G' || s[i] == 'H' || s[i] == 'I')
45             nn += 4 * pow(10.0,double(k++));
46         else if (s[i] == 'J' || s[i] == 'K' || s[i] == 'L')
47             nn += 5 * pow(10.0,double(k++));
48         else if (s[i] == 'M' || s[i] == 'N' || s[i] == 'O')
49             nn += 6 * pow(10.0,double(k++));
50         else if (s[i] == 'P' || s[i] == 'R' || s[i] == 'S')
51             nn += 7 * pow(10.0,double(k++));
52         else if (s[i] == 'T' || s[i] == 'U' || s[i] == 'V')
53             nn += 8 * pow(10.0,double(k++));
54         else if (s[i] == 'W' || s[i] == 'X' || s[i] == 'Y')
55             nn += 9 * pow(10.0,double(k++));
56         else if (s[i] >= '0' && s[i] <= '9')
57             nn += (s[i]-48) * pow(10.0,double(k++));
58         else
59             continue;
60     }
61     return nn;
62 }
63 
64 string change_long(long m)
65 {
66     string s = "";
67     for (long i = 0; i < 7; i++)
68     {
69         long p1 = pow(10.0,double(7-i));
70         long p2 = pow(10.0,double(6-i));
71         long c = (m%p1)/p2;
72         s += (c+48);
73     }
74     long k = 0;
75     for (string::iterator it = s.begin(); ;k++,it++)
76         if (k == 3)
77         {
78             s.insert(it,'-');
79             break;
80         }
81     return s;
82 }

后续工作思考

(1)数组需要开的足够大,10000000;

(2)可以用快速排序对整数进行排序,采用快排,再统计出现次数。

 

posted on 2012-12-01 16:25  X.er86  阅读(136)  评论(0)    收藏  举报