Codeforces 11.27 B

本文详细介绍了解决IPv6字符处理难题的过程,包括输入字符串的解析、特殊字符位置的判断以及输出格式的实现。

B. Restoring IPv6

状态不好,看来好久才看出题意,字符处理始终是我的弱项,有空联系下。记录一下。

View Code
 1 #include <iostream>
 2 #include <cassert>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <vector>
 6 #include <algorithm>
 7 using namespace std;
 8 
 9 const int MM = 110010;
10 #define fuck puts("fuck")
11 #define VI vector<int>
12 typedef long long int64;
13 #define mod 1000000007
14 
15 char ch[MM];
16 
17 void solve() {
18     int i,j,k,len;
19     scanf("%s",ch);
20     len=strlen(ch);
21     if(len==2&&ch[0]==':'&&ch[1]==':') {
22         for(i=0;i<7;i++) printf("0000:"); puts("0000");
23     }
24     else {
25         int pos[MM]={0},all=0;
26         for(i=0;ch[i];i++) if(ch[i]==':') all++;
27         if(ch[len-1]==':'&&ch[len-2]==':') pos[len-2]=1;
28         for(i=0;i<len-2;i++) {
29             if(ch[i]==':'&&ch[i+1]==':') {
30                 if(ch[i-1]=='0'&&ch[i+2]=='0') pos[i]=2;
31                 else pos[i]=3;
32             }
33         }
34 //        for(i=0;i<len;i++) printf("%d %d\n",i,pos[i]);
35         int zero=9-all;
36         for(i=0;i<len;i++) {
37             for(j=i;j<=i+4;j++) if(ch[j]==':'||j==(len)) break;
38             for(k=0;k<(-j+i+4);k++) printf("0");
39             for(k=i;k<j;k++) printf("%c",ch[k]);
40             if(ch[j]==':') {
41             if(pos[j]==0)  printf(":"),i=j;
42             else if(pos[j]==1) {
43                for(k=0;k<zero;k++)printf(":0000");i=j+1;
44             }
45 //            else if(pos[j]==2) printf(":0000:"),i=j+1;
46             else {
47                 for(i=1;i<zero;i++) printf(":0000");
48                 printf(":");
49                 i=j+1;
50             }
51             }
52             else i=j+1;
53         }
54         puts("");
55     }
56 }
57 
58 int main() {
59     int ca; scanf("%d",&ca);
60     while(ca--) solve();
61     return 0;
62 }

转载于:https://www.cnblogs.com/zhang1107/archive/2012/11/27/2791533.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值