2019 牛客多校第6场Shorten IPv6 Address

it2025-01-16  22

1. 双指针 寻找 最长连续 0 的写法 :

[ last, i  )  为每次的判断区间

last = 0;

for(  int i = 0;i < len;i++ ){

       if(  a[i] == 0 ) continue;

       last = i+1;

}

2.进制转换的方法

#include <bits/stdc++.h> using namespace std; int cnt = 0; char ans[9][5]; int bg[9]; char F( int x ){ if( x <= 9 ) return '0'+x; return 'a'+x-10; } void change(char* s){ int c = 0; for( int i = 0;i < 16;i++ ){ c += (s[i] == '1') << (16-i-1); } for( int i = 1;i <= 4;i++ ){ ans[cnt][i] = F(c%16); c /= 16; } int i = 4; while( i >= 1 && ans[cnt][i] == '0' )i--; bg[cnt] = i; cnt++; } int main(){ int T; scanf("%d",&T); for( int tt = 1;tt <= T;tt++ ) { printf("Case #%d: ", tt); memset(bg, 0, sizeof(bg)); char str[129]; cnt = 0; scanf("%s", str); for (int i = 0; i < 128; i += 16) { change(str + i); } int last = 0, len = 2, l = -1, r = -1; bg[8] = 1; for (int i = 0; i <= 8; i++) { if (bg[i] == 0) continue; if (i - last >= 2) { int cur; if (last == 0 || i == 8) { cur = (i - last) * 2 - 2; } else { cur = (i - last) * 2 - 1; } if (cur >= len ) { l = last; r = i - 1; len = cur; } } last = i + 1; } for (int i = 0; i < 8; i++) { if (i == l) printf("::"); if (i >= l && i <= r) continue; for (int j = bg[i]; j >= 1; j--) { printf("%c", ans[i][j]); } if (bg[i] == 0) printf("0"); if (i != l - 1 && i != 7) printf(":"); } cout << endl; } return 0; }

 

最新回复(0)