2019 뉴커머스 여름방학 다교훈련소(6)-B(시뮬레이션)-Shorten IPv6 Address

3479 단어 모방하다

2019 뉴커머스 여름방학 다교훈련소(제6차) B-Shorten IPv6 Address

  • 제목설명
  • 사고방식
  • 코드
  • 오류
  • 제목 링크: 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; }

    착오점


              \;\;\;\;\; 문자열 시뮬레이션 문제.문제해설은 제출 중 가장 짧은 몇 개의 코드를 배우는 것을 추천합니다.차이가 많이 나는 것 같아요.

    좋은 웹페이지 즐겨찾기