2019 뉴커머스 여름방학 다교훈련소(6)-B(시뮬레이션)-Shorten IPv6 Address
3479 단어 모방하다
2019 뉴커머스 여름방학 다교훈련소(제6차) B-Shorten IPv6 Address
제목 설명
\;\;\;\;\; IP v 6 IPv6 IPv6 주소를 128 128 128 비트 이진 문자열로 표시하여 간략화합니다.간소화 규칙은 다음과 같다. & ThickSpace; \;\;\;\;\; 바이너리를 16진수로 변환하고, 이동한 후, 4자리마다 한 구역으로, ":": ":": "로 구분한다.ThickSpace; \;\;\;\;\; 각 영역의 리드 0 0 0 0은 삭제할 수 있습니다.ThickSpace; \;\;\;\;\; 두 개 이상의 영역이 0일 경우 0을 ":"":"":""::"로 대체하여 한 번만 사용할 수 있습니다.
\;\;\;\;\; 구: 간소화 후 가장 짧은 주소, 여러 개가 존재하면 출력 사전 순서가 가장 작습니다.ThickSpace; \;\;\;\;\; 1 ≤ T ≤ 1000 1\leq T\leq 1000 1≤T≤1000.
사고의 방향
\;\;\; 또 한 번의 힘으로 맞서는... 나도 못하지만 열심히 일하지 않는 동료 & Thick Space;ThickSpace; \;\;\; 우선 길이가 가장 짧고 여러 길이의 연속 0 0 0 0을 확보하고 가장 긴 간소화를 선택하겠습니다.ThickSpace; \;\;\; 0:0:0:0:1:1:0:0:0:0:0:0:0:0:1:1:0:0:0:0:0:0:1:1:0:0:0:0:0:0:0과 같은 여러 길이의 연속 0은 사전 순서에 따라 가장 작고 뒤에 있는 지역화 약자를 선택합니다.e g : eg: eg: "0 : 0 : 0 : 1 : 1 : : "< ": : 1 : 1 : 0 : 0 : 0 ""0:0:0:1:1::"< "::1:1:0:0:0""0:0:0:1:1::"<"::1:1:0:0:0". \;\;\; 그러나 나는 하나의 구덩이를 소홀히 했다. 그것은 길이가 같은 연속 0.00, 처음과 끝의 공헌이 다르다는 것이다.ThickSpace; \;\;\; e g : eg: eg: “0 : 0 : 1 : 0 : 0 : 1 : 0 : 0 ” → “0 : 0 : 1 : 0 : 0 : 1 : : ” “0:0:1:0:0:1:0:0”\rightarrow “0:0:1:0:0:1::” “0:0:1:0:0:1:0:0”→“0:0:1:0:0:1::”. \;\;\; \;\;\; \;\; “0 : 0 : 1 : 0 : 0 : 1 : 0 : 0 ” → “0 : 0 : 1 : : 1 : 0 : 0 ” “0:0:1:0:0:1:0:0”\rightarrow “0:0:1::1:0:0” “0:0:1:0:0:1:0:0”→“0:0:1::1:0:0”.
코드
#include
using namespace std;
const int MAXN = 200;
#define EPS (1e-10)
int b[MAXN], c[MAXN];
int main() {
int T;
int Len3 = 8;
scanf("%d", &T);
for(int tt = 1; tt <= T; tt++) {
for(int i = 1; i <= 8; i++) {
int x = 0, s;
for(int j = 1; j <= 16; j++) {
scanf("%1d",&s);
x = x*2 + s;
}
b[i] = x;
}
for(int i = 1; i <= 10; i++) c[i] = 0; c[0] = 100;
int l = 0;
for(int i = 1; i <= Len3; i++) {
if(b[i] == 0) l++;
else if(l > 0) {
c[l] = i - l;
l = 0;
}
}
if(l > 0 && c[l] <= 1) c[l] = Len3 - l + 1;
bool flag = 0;
printf("Case #%d: ",tt);
for(int i = 8; i >= 2;i--) {
if(c[i] > 0) {
for(int j = 1; j <= 8; j++) {
if(j == c[i]) {
flag = 1;
printf("::");
j = j + i - 1;
}
else {
printf("%x", b[j]);
if(j < 8 && flag || (!flag && (j+1) != c[i])) printf(":");
}
}
printf("
");
flag = 1;
break;
}
}
if(!flag) {
for(int i = 1; i <= 8; i++) {
printf("%x%c", b[i],":
"[i==8]); // ,
}
}
}
return 0;
}
착오점
\;\;\;\;\; 문자열 시뮬레이션 문제.문제해설은 제출 중 가장 짧은 몇 개의 코드를 배우는 것을 추천합니다.차이가 많이 나는 것 같아요.