【思维】1320 压缩技术(续集)——灵活运用位运算

P1320 压缩技术(续集版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题解 P1320 【压缩技术(续集版)】 - RedContritio 的博客 - 洛谷博客 (luogu.com.cn)

注意:题解的代码,无法跳出第二个循环 for(;~scanf("%c",&c);) 。

ps.挺无语的,dev上面测试没有问题,一交上去就wa了。下载下来的测试点在dev上也没问题。换字符函数、提交时换c++版本、左改右改,wa声一片,不得其解。

最后想到用通过洛谷自带的在线IDE debug,终于发现这题在oj里换行由两个字符组成:第一个是CR(归位键,ASCII码13),第二个才是换行键LF(换行键,ASCII码10)。因为我是用换行 ' '//ASCII码10 控制第二个循环的跳出,所以在洛谷IDE的结果与在dev上的结果不一样。发现这一点后,在洛谷IDE上改代码,试图保持用换行控制第二个循环,但失败了,莫名其妙超时。于是干脆换成用字符数控制,也就是下面的形式,这下就没问题了。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int main(){
    int d[40005],i=1,n;
    char c;
    while(scanf("%c",&c)&&c>=('0')) 
        i+=!(i&1^(c-'0')),d[i]++,d[0]++;
    n=d[0]*(d[0]-1);
    while(n){
        scanf("%c",&c);
        if(c>='0') i+=!(i&1^(c-'0')),d[i]++,n--; 
    }
    rep(j,0,i)
        cout<<d[j]<<" ";
    return 0;
}
原文地址:https://www.cnblogs.com/infocodez/p/14986355.html