题意:转换一个128位的二进制串,变成16进制,并且格式为x:x:x:x:x:x:x:x然后多个相邻的0变成::,且只有一个::,求变成的字典序最小且最短的字符串。
思路:大水题,但是就是一直wa,思路都一样的还是wa。先将二进制转化为十进制,然后用%x输出,因为连续的0可变短,但有优先级,首先选0长的,然后如果长度相等,先选中间,中间里面先选中间偏后,然后是最后,最后是前面。差不多就这意思吧。
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<map> #include<queue> #define ll long long using namespace std; const int N = 1000 + 10; char s[N];int a[10], r[10]; int main() { int T; scanf("%d", &T); for (int tii = 1; tii <= T; tii++) { scanf("%s", s + 1); for (int i = 1; i <= 8; i++) { a[i] = 0; for (int j = 1; j <= 16; j++) { a[i] = a[i] * 2 + s[(i - 1) * 16 + j] - '0'; } } memset(r, 0, sizeof(r)); printf("Case #%d: ", tii); int id = 0; for (int i = 8; i > 0; i--) { if (a[i] == 0) r[i] = r[i + 1] + 1; if (r[id] < r[i]) id = i; if (r[id] == r[i] && r[id] + id - 1 == 8 && i != 1) id = i; } for (int i = 1; i <= 8; i++) { if (id == i && r[i] >= 2) { if (id == 1) printf(":"); printf(":"); i += r[id] - 1; } else { printf("%x", a[i]); if (i != 8) printf(":"); } } printf(" "); } return 0; }