萌新求助,#1中本机same有1,提交same全零,求调
查看原帖
萌新求助,#1中本机same有1,提交same全零,求调
494862
MIKE_LO_MPPC楼主2022/12/25 16:16
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 55;
const int Mod = 100001;

string st;
int ty[15], ans[15];
char ch[N];
int n, line[N], num[N], cnt, lf[N], rt[N];

void del(int pos) {
	string t = "";
	for (int i = 0; i < pos; i++) t += st[i];
	for (int i = pos; i < n - 1; i++) t += st[i + 1];
	n = t.size();
	st = t;
}

void init() {
	memset(line, 0, sizeof(line));
	memset(num, 0, sizeof(num));
	memset(ch, 0, sizeof(ch));
	memset(lf, 0, sizeof(lf));
	memset(rt, 0, sizeof(rt));
	cnt = 0;
	n = st.size();
	stack<int> s, ss;
	for (int i = 0; i < n; i++) if (st[i] == ' ') s.push(i);
	while (!s.empty()) {
		del(s.top());
		s.pop();
	}
	for (int i = 0; i < n; i++) {
		if (st[i] == '(') s.push(i);
		if (st[i] == ')') {
			if (!s.empty()) s.pop();
			else ss.push(i);
		}
	}
	while (!s.empty()) {
		del(s.top());
		s.pop();
	}
	while (!ss.empty()) {
		del(ss.top());
		ss.pop();
	}
	for (int i = 0; i < st.size(); i++) {
		if (st[i] == '(') s.push(i);
		else if (st[i] == ')') {
			line[s.top()] = i;
			s.pop();
		}
	}
    //cout << st << endl;
}

int String_To_Num(int l, int r) {
	int sum = 0;
	for (int i = l; i <= r; i++) sum = sum * 10 + st[i] - '0';
	return sum;
}

void build(int l, int r) {
    //printf("%d %d\n", l, r);
	if (l == r && st[l] == 'a') {
		ch[++cnt] = 'a';
		return;
	}
	while (st[l] == '(' && st[r] == ')' && line[l] == r) l++, r--;
	int p1 = -1, p2 = -1, p3 = -1, p;
	for (int i = l; i <= r; i++) {
		if (st[i] == '(') i = line[i];
		else if (st[i] == '+' || st[i] == '-') p1 = i;
		else if (st[i] == '*' && p1 == -1) p2 = i;
		else if (st[i] == '^' && p1 == -1 && p2 == -1) p3 = i; //从左到右
	}
	p = (p1 > -1 ? p1 : (p2 > -1 ? p2 : p3));
	if (p == -1) {
		num[++cnt] = String_To_Num(l, r);
        //printf("num%d = %d\n", cnt, num[cnt]);
        ch[cnt] = ' ';
		return;
	}
	int x = ++cnt;
	ch[x] = st[p];
	lf[x] = cnt + 1;
	build(l, p - 1);
	rt[x] = cnt + 1;
	build(p + 1, r);
}

int get() { return rand() % 100; }

int calc(int a, int b, char op) {
	if (op == '+') return a + b;
	if (op == '-') return a - b;
	if (op == '*') return a * b;
	if (op == '^') return (int)pow(a, b) % Mod;
}

void dfs(int x, int rd) {
	//printf("%lld, %d %c\n", x, ch[x], ch[x]);
	if (ch[x] == 'a') {
		num[x] = (rd + Mod) % Mod;
		return;
	}
	if (ch[x] == ' ') return;
	dfs(lf[x], rd), dfs(rt[x], rd);
	num[x] = (calc(num[lf[x]], num[rt[x]], ch[x]) + Mod) % Mod;
}

signed main() {
	srand((int)time(NULL));
	getline(cin, st);
	init();
	build(0, n - 1);
	for (int i = 1; i <= 10; i++) {
		ty[i] = get();
		dfs(1, ty[i]);
		ans[i] = num[1];
		//printf("1:%lld  2:%lld  3:%lld  4:%lld    %lld, %lld\n", num[1], num[2], num[3], num[4], ans[i], ty[i]);
	}
    
	int t;
	scanf("%lld\n", &t);
    //printf("%lld", t);
	for (int i = 1; i <= t; i++) {
		getline(cin, st);
        //cout << st << endl;
		init();
		build(0, n - 1);
		bool same = true;
		for (int j = 1; j <= 10; j++) {
			dfs(1, ty[j]);
			//if (i == 4) printf("9:%lld 8:%lld 7:%lld 6:%lld 5:%lld 4:%lld 3:%lld 2:%lld 1:%lld  ", num[9], num[8], num[7], num[6], num[5], num[4], num[3], num[2], num[1]);
			if (ans[j] != num[1]) {
				same = false;
				break;
			}
		}
        //printf("%d\n", same);
		if (same) printf("%c", 'A' + i - 1);
	}
    return 0;
}
2022/12/25 16:16
加载中...