算法竞赛入门经典(第2版)习题4-5 IP网络 IP Networks UVa1590
2014-08-11 13:30
555 查看
这道题的逻辑很简单,读入所有的ip地址,确认总共32位二进制数中最左一个不同是在哪里出现的,然后按规则输出网络地址与子网掩码即可。
可上传后我发现它就是wa...还是wa...总是wa......
然后我在网上找到了例程,设想出了很多测试数据,用fc拍来拍去,总是报告“找不到差异”。
我觉得可能是测试数据想得不周全,看到书上注明这个是NEERC 2005的比赛题,于是我找到了这场比赛的官方测试数据。
但fc还是“找不到差异”......
最后我决定往输出的最末尾添加一个“\n",然后就ac了。这和习题4-3正好相反。
原来如果A文本末尾只有一个"\n”而B文本没有“\n"的话,fc会无视这种差异,但UVa在乎。
习题4-3与习题4-5你们两个“磨人的小妖精”......
可上传后我发现它就是wa...还是wa...总是wa......
然后我在网上找到了例程,设想出了很多测试数据,用fc拍来拍去,总是报告“找不到差异”。
我觉得可能是测试数据想得不周全,看到书上注明这个是NEERC 2005的比赛题,于是我找到了这场比赛的官方测试数据。
但fc还是“找不到差异”......
最后我决定往输出的最末尾添加一个“\n",然后就ac了。这和习题4-3正好相反。
原来如果A文本末尾只有一个"\n”而B文本没有“\n"的话,fc会无视这种差异,但UVa在乎。
习题4-3与习题4-5你们两个“磨人的小妖精”......
//#define LOCAL //#define TESTING #include<stdio.h> #include<ctype.h> #include<string.h> #include<iostream> #include<cstdio> #define MAXN 1005 int sec[MAXN][5],mask[5],ip[5]; char sec2[MAXN][40], mask2[40], ip2[40]; void save(char* s, int n, int ind) { int se = 0, temp = 0; for(int i = 0; i <= n; i++) { if(isdigit(s[i])) temp = temp * 10 +s[i]-'0'; else { sec[ind][se] = temp; se++; temp = 0; } } for(int i = 3; i >= 0; i--) { int temp2; temp2 = sec[ind][i]; for(int j = 0; j < 8; j++) { sec2[ind][24-i*8+j] = temp2 % 2+'0'; temp2 /= 2; } } #ifdef TESTING printf("sec[%d]= %d.%d.%d.%d = %s\n", ind, sec[ind][0], sec[ind][1], sec[ind][2], sec[ind][3], sec2[ind]); #endif } void getip(int ind) { memset(ip,0,sizeof(ip)); memset(ip2,0,sizeof(ip2)); for(int i = 0; i < 32; i++) { if(i<ind) ip2[i] = '0'; else ip2[i] = sec2[1][i]; } #ifdef TESTING printf("ip2=%s\n", ip2); #endif for(int i = 0; i < 4; i++) { int n = 1; for(int j = 0; j < 8; j++) { ip[3-i] += (ip2[j+8*i]-'0')*n; n*=2; } } } void getmask(int ind) { memset(mask,0,sizeof(mask)); memset(mask2,0,sizeof(mask2)); for(int i = 0; i < 32; i++) { if(i<ind) mask2[i] = '0'; else mask2[i] = '1'; } #ifdef TESTING printf("mask2="); for(int i = 0; i<32; i++) printf("%c", mask2[i]); printf("\n"); //printf("mask2=%s\n",mask2); #endif for(int i = 0; i < 4; i++) { int n = 1; for(int j = 0; j < 8; j++) { mask[3-i] += (mask2[j+8*i]-'0')*n; n*=2; } } } using namespace std; int main() { #ifdef LOCAL freopen("xt4-5.in", "r", stdin); freopen("xt4-5.out", "w", stdout); #endif memset(sec,0,sizeof(sec)); int N; bool first = true; //while(cin>>N) while(scanf("%d", &N)!=EOF) { for(int i = 1; i <= N; i++) { char temps[MAXN]; scanf("%s", temps); #ifdef TESTING printf("n=%d %s\n", strlen(temps), temps); #endif save(temps,strlen(temps),i); } int byte = 0; for(int i = 2; i <=N; i++) { for(int j = 31; j >= byte; j--) { if(sec2[i][j]!=sec2[1][j]) { byte = j+1; break; } } } getip(byte); getmask(byte); #ifdef TESTING printf("%d\n", byte); #endif if(!first) printf("\n"); for(int i = 0; i < 4; i++) { if(i) printf("."); printf("%d", ip[i]); } printf("\n"); for(int i = 0; i < 4; i++) { if(i) printf("."); printf("%d", mask[i]); } first = false; } printf("\n");//能不能ac就靠这句了 return 0; }
相关文章推荐
- 算法竞赛入门经典 第二版 习题4-5 IP网络 IP Networks uva1590
- 算法竞赛入门经典(第2版)习题3-3 数数字 Digit Counting UVa1225
- 算法竞赛入门经典(第2版)习题3-5 谜题 Puzzle UVa227
- 算法竞赛入门经典(第2版)习题4-10 洪水! Flooded! UVa815
- 算法竞赛入门经典(第2版)习题4-8 特别困的学生UVa12108
- 算法竞赛入门经典(第2版)习题4-5 IP网络UVa1590
- 算法竞赛入门经典(第2版)习题3-1 得分 Score UVa1585
- 算法竞赛入门经典(第2版)习题1-3详解
- 算法竞赛入门经典(第2版)习题4-8 特别困的学生 Extraordinarily Tired Students UVa12108
- 算法竞赛入门经典(第2版)习题4-7 RAID技术 RAID! UVa509
- 《算法竞赛入门经典》(第2版)第二章习题
- 算法竞赛入门经典(第2版)习题3-6 纵横字谜的答案 Crossword Answers UVa232
- 算法竞赛入门经典(第2版)习题3-11 换低挡装置 Kickdown UVa1588
- 算法竞赛入门经典(第2版)习题3-10 盒子 Box UVa1587
- 算法竞赛入门经典(第2版)习题4-9 数据挖掘 Data Mining UVa1591
- 算法竞赛入门经典(第2版)习题3-4 周期串 Periodic Strings UVa445
- 算法竞赛入门经典(第2版)习题3-9 子序列 All in All UVa10340
- 算法竞赛入门经典(第2版)习题4-1 象棋 Xiangqi UVa1589
- 算法竞赛入门经典(第2版)习题4-2 正方形UVa201
- 算法竞赛入门经典(第2版)习题1-1详解