cjwen's blog

「水」hack 某位同学的 SPJ

2022-02-11 · 4 min read

v1

原「史上最牛逼 SPJ」:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;char str[10000005],str1[10000005];
int main() {int x,y;
    FILE *fco=fopen("code","r"),*frep=stderr;
    FILE *fop=fopen("user_out","r"),*fsco=stdout;
    FILE *fans=fopen("answer","r");
    while(~fscanf(fop,"%d",&x))
    {
    	fscanf(fans,"%d",&y);
	    if(x^y)
	    {
	        fprintf(frep,"Wrong Answer! Expected %lld but read %lld",y,x);
	        fprintf(fsco,"0");return 0;
	    }
    	
	}
    
    while (~fscanf(fco,"%s",str)) {int sz=strlen(str);
        for (register int i=0;i<sz;++i){if ((str[i]=='s'&&str[i+1]=='o')) {
            fprintf(frep,"Character 'r' is found in your code!");
            fprintf(fsco,"0");return 0;
        }
        if ((str[i]=='q')) {
            fprintf(frep,"Character 'q' is found in your code!");
            fprintf(fsco,"0");return 0;
        }
		}
    }fprintf(frep,"Accepted!");fprintf(fsco,"100");return 0;
}

神奇 SPJ,什么都不输出就可以拿满分,导致 1B 过 T1。

(差点 0B,要交上去的时候 SPJ 被修好了

v2

代码中不允许出现连续的 's' 和 'o',不允许出现 'q'

看来去重没办法了,但 sort 还是可以用的。

s\
ort(a, a+n);

后来被改了,「\」前不允许出现 "sort" 中任意字符。

v3

python? python!

众所周知 python 中 exec() 函数可以执行指定语句,所以 exec("a.s"+"ort()") 就可以避开检测。

后题目改成了 20m, 100ms,python空间大,过不去。

尝试改成以下,但发现读入就爆空间了。。。。。

(改之前是不是 C++ 冒泡也能过啊?

n = int(input())

a = input().split()

i = 0
while i < n:
    a[i] = int(a[i])
    i = i + 1

exec("a.s"+"ort()")

i = 0
while i < n:
    print(a[i], end=' ')
    i = i + 1

print()

exec("a = list(s"+"et(a))")
exec("a.s"+"ort()")

print(len(a))

i = 0
while i < n:
    print(a[i], end=' ')
    i = i + 1

v4

写完作业,想起来 define……

所以

#define S s##ort

就可以使用 sort 了!

最终 AC 代码如下:

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>

#define S s##ort

using namespace std;

const int N = 1e5 + 10;

int n, a[N];
vector <int> b;

int main(){

    scanf("%d", &n);

    for(int i = 0; i < n; i++){
        scanf("%d", &a[i]);
    }

    S(a, a+n);

    for(int i = 0; i < n; i++){
        printf("%d ", a[i]);
    }

    puts("");

    b.push_back(a[0]);

    for(int i = 1; i < n; i++){
        if(a[i] != a[i-1]){
            b.push_back(a[i]);
        }
    }

    printf("%d\n", b.size());

    for(int i = 0; i < b.size(); i++){
        printf("%d ", b[i]);
    }

    puts("");

    return 0;
}

截止发博文时 SPJ 并未被修。

Copyright © 2021~2024 cjwen