忘羡 2016-08-06 10:21 采纳率: 0%
浏览 1143

求助大神们:关于poj上第三道题487-3279,我在编辑器上过了提交上去就不行

原题

企业喜欢用容易被记住的电话号码。让电话号码容易被记住的一个办法是将它写成一个容易记住的单词或者短语。例如,你需要给滑铁卢大学打电话时,可以拨打TUT-GLOP。有时,只将电话号码中部分数字拼写成单词。当你晚上回到酒店,可以通过拨打310-GINO来向Gino's订一份pizza。让电话号码容易被记住的另一个办法是以一种好记的方式对号码的数字进行分组。通过拨打必胜客的“三个十”号码3-10-10-10,你可以从他们那里订pizza。

电话号码的标准格式是七位十进制数,并在第三、第四位数字之间有一个连接符。电话拨号盘提供了从字母到数字的映射,映射关系如下:
A, B, 和C 映射到 2
D, E, 和F 映射到 3
G, H, 和I 映射到 4
J, K, 和L 映射到 5
M, N, 和O 映射到 6
P, R, 和S 映射到 7
T, U, 和V 映射到 8
W, X, 和Y 映射到 9

Q和Z没有映射到任何数字,连字符不需要拨号,可以任意添加和删除。 TUT-GLOP的标准格式是888-4567,310-GINO的标准格式是310-4466,3-10-10-10的标准格式是310-1010。

如果两个号码有相同的标准格式,那么他们就是等同的(相同的拨号)

你的公司正在为本地的公司编写一个电话号码薄。作为质量控制的一部分,你想要检查是否有两个和多个公司拥有相同的电话号码。
Input

输入的格式是,第一行是一个正整数,指定电话号码薄中号码的数量(最多100000)。余下的每行是一个电话号码。每个电话号码由数字,大写字母(除了Q和Z)以及连接符组成。每个电话号码中只会刚好有7个数字或者字母。
Output

对于每个出现重复的号码产生一行输出,输出是号码的标准格式紧跟一个空格然后是它的重复次数。如果存在多个重复的号码,则按照号码的字典升序输出。如果输入数据中没有重复的号码,输出一行:
No duplicates.
Sample Input

12
4873279
ITS-EASY
888-4567
3-10-10-10
888-GLOP
TUT-GLOP
967-11-11
310-GINO
F101010
888-1200
-4-8-7-3-2-7-9-
487-3279
Sample Output

310-1010 2
487-3279 4
888-4567 3

代码:****

#includeiostream
#includestring
#includevector
#includealgorithm(因为显示不出来所以把尖括号去了)
using namespace std;
class strint{
public:
string s;
int i;
strint(string ss, int ii) :s(ss), i(ii){};
strint(){ i = 1;};
friend ostream &operator<<(ostream &os,strint ss);
friend bool cmp(strint a, strint b);
};
ostream& operator<<(ostream &os,strint ss){
cout << ss.s.substr(0,3)<<'-'< return os;
}
bool cmp(strint a, strint b){
if (a.s else return false;
}
int main()
{
int n;
cin >> n;
string c = "ABCDEFGHIJKLMNOPRSTUVWXY";
string cs = "222333444555666777888999";
string *s = new string[n];
strint *p = new strint[n];
vector v1,v2;
for (int i = 0; i < n; i++)
{
cin >> s[i];
for (int j = 0; j < s[i].length(); j++)
{
int b = c.find(s[i][j]);
if (b != string::npos)s[i][j] = cs[b];
int k = s[i].find('-');
if (k != -1) s[i]=s[i].erase(k,1);
}

p[i].i = 1;
p[i].s = s[i];
v1.push_back(p[i]);
}
sort(v1.begin(), v1.end(), cmp);
for (int m = 0; m < n; m++)
{
if (v1[m].i != 0)
{
for (int j = m + 1; j < n; j++)
{
if (v1[m].s == v1[j].s)
{
v1[m].i++;
v1[j].i--;
}
else break;
}
}
}
for (int z = 0; z< v1.size(); z++)
{
if (v1[z].i != 1&&v1[z].i!=0) v2.push_back(v1[z]);
}
if (v2.empty())cout << "No duplicates." << endl;
else
{
for (int z = 0; z < v2.size(); z++)
{
cout << v2[z] << endl;
}
}
return 0;
}

  • 写回答

2条回答 默认 最新

  • threenewbee 2016-08-06 10:32
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料