时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB
描述
小Hi在一家互联网巨头公司实习。他发现由于公司不同的部门实在太多了,导致使用的一些开发工具和软件库的版本非常不统一、五花八门。
比如一款工具就有2.96, 3.4.5, 4.8.2, 6.4和7.2几种不同的版本。
现在给出了N个版本号,请你帮助小Hi把这些版本号从旧到新排序。
版本号格式都是若干由'.'连接起来的非负整数。比较版本号新旧时先主版本号(最左的整数)开始,再比较次版本号(第二个整数),以此类推……。
例如2.96 < 3.4.5 < 4.8.2 < 4.8.4 < 4.13 < 6.4 < 7.2
特别的,我们认为NULL小于0,也即1.0 < 1.0.0,4.8.2 < 4.8.2.0。
输入
第一行包含一个整数N。 (1 ≤ N ≤ 100)
以下N行每行一个版本号。 版本号总长度不超过100,主版本号和每个子版本号的数值不超过100
输出
N行,每行一个版本号,从旧到新排列。
样例输入
9 4.8 4.8.2 7.2 2.96 3.4.5 1.0 2 6.4 1.0.0
样例输出
1.0 1.0.0 2 2.96 3.4.5 4.8 4.8.2 6.4 7.2
#include<bits/stdc++.h>
using namespace std;
int N;
struct node{
string x; int id;
}a[105];
string an[105];
int main()
{
cin >> N;
for(int i=0; i<N; i++)
{
string s; cin >> s;
an[i] = s;
s += '.';
int id = 0;
while(s.find('.', id) != s.npos)
{
int at = s.find('.', id);
s.insert(id, 3 - at + id, '0');
id += 4;
}
while(s.size() <= 105) s += '.' - 1;
a[i].x = s; a[i].id = i;
}
sort(a, a+N, [](node x, node y){return x.x < y.x;});
for(int i=0; i<N; i++)
{
cout << an[a[i].id] << "\n";
}
return 0;
}