JOI2007本選sol_check@C++

前回記事で書いたとおり、JOI2007本選問題4の解答チェックプログラムのソースがないっぽいので、自分で作った。

もちろん、このソース自身が間違ってる可能性も十分にあるので注意。

#include <error.h>
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

int main(int argc, char *argv[], char *envp[])
{
	if(argc < 3) {
		printf("usage: ./sol_check INPUT OUTPUT\n");
		return 1;
	}
	char *input_name = argv[1];
	char *output_name = argv[2];
	FILE *input = fopen(input_name, "r");
	if(!input){perror(input_name);return -1;}
	FILE *output = fopen(output_name, "r");
	if(!output){perror(output_name);return -1;}
	int n;
	int m;
	fscanf(input, "%d\n", &n);
	fscanf(input, "%d\n", &m);
	vector<int> dest(n);
	vector<int> revdest(n);
	vector<bool> saflags(n-1);
	for(int i=0;i<n;i++) {
		int c;
		fscanf(output, "%d", &c);
		c--;
		dest[i] = c;
		revdest.at(dest[i]) = i;
	}
	for(int i=0;i<m;i++) {
		int a;
		int b;
		fscanf(input, "%d %d", &a, &b);
		a--;
		b--;
		if(revdest[a] >= revdest[b]) {
			printf("wrong\n");
			fclose(input);
			fclose(output);
			return -1;
		} else if(revdest[a] + 1 == revdest[b]) {
			saflags.at(revdest[a]) = true;
		}
	}
	bool single_answer_flag = true;
	for(int i=0;i<n-1;i++) {
		single_answer_flag = single_answer_flag && saflags[i];
	}
	bool amaflag;
	fscanf(output, "%hhd", &amaflag);
	if(amaflag != !single_answer_flag) {
		printf("wrong\n");
		fclose(input);
		fclose(output);
		return -1;
	}
	printf("correct\n");
	fclose(input);
	fclose(output);
	return 0;
}