wa+tle
查看原帖
wa+tle
384214
esquigybcu楼主2021/5/22 15:56
#include <stdio.h>
#include <string.h>

#define io(x) freopen(x ".in", "r", stdin); freopen(x ".out", "w", stdout);

typedef long long ll;
const int SIZE = 64, MOD = 1e9 + 7;

ll qpow(ll a, ll b)
{
	//printf("qpow(%lld, %lld) called\n", a, b);
	if (!b)
	    return 1;
    ll ans = qpow(a, b >> 1);
    ans *= ans, ans %= MOD;
    if (b & 1)
        ans *= a, ans %= MOD;
    //printf("qpow(%lld, %lld) = %lld\n", a, b, ans);
	return ans; 
}

ll calc(char *s, int left, int right, ll a)
{
	//printf("calc(s, %d, %d, %d) called\n", left, right, a);
	int min = 936936936, min_pos = 936936936, cur = 0;
	bool is_number = true;
	for (int i = left; i < right; i++)
	{
		int curprio = 936936944;
		if (s[i] == '(') cur += 114;
		if (s[i] == ')') cur -= 114;
		if (s[i] == '+' || s[i] == '-') curprio = cur + 1, is_number = false;
		if (s[i] == '*') curprio = cur + 2, is_number = false;
		if (s[i] == '^') curprio = cur + 3, is_number = false;
		
		if (curprio <= min) min = curprio, min_pos = i;
	}
	//printf("min is %d, min_pos is %d, is_number = %d\n", min, min_pos, is_number);
	ll ret;
	if (is_number)
	{
		bool is_a = false;
		
		for (int i = left; i < right; i++)
		    if (s[i] == 'a')
		    {
		        ret = a, is_a = true;
		        break;
		    }
		
		if (!is_a)
		{
		    int num = 0;
		    for (int i = left; i < right; i++)
		        if ('0' <= s[i] && s[i] <= '9')
		            num = 10 * num + s[i] - '0';
		    ret = num;
	    }
	}
	else
	{
	    ll qwq = calc(s, left, min_pos, a);
	    ll QWQ = calc(s, min_pos + 1, right, a);
	    if (s[min_pos] == '+')
	        ret = (qwq + QWQ) % MOD;
	    if (s[min_pos] == '-')
	        ret = ((qwq - QWQ) % MOD + MOD) % MOD;
	    if (s[min_pos] == '*')
	        ret = (qwq * QWQ) % MOD;
	    if (s[min_pos] == '^')
	        ret = qpow(qwq, QWQ);
    }
	//printf("calc(s, %d, %d, %d) returned %lld\n", left, right, a, ret);
	return ret;
}

char s[SIZE], t[SIZE];
const int tests[] = {0, 1, 2, 5, 10, 114, 514, 926, 936, 1919810};

int main()
{
	scanf("%s", s);
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%s", t);
		bool ok = true;
		for (int j = 0; j < sizeof(tests) / sizeof(*tests); j++)
		    if (calc(s, 0, strlen(s), tests[j]) != calc(t, 0, strlen(t), tests[j]))
		    {
		    	ok = false;
		    	break;
			}
		if (ok)
		    putchar('A' + i);
	}
}

recordrecord

2021/5/22 15:56
加载中...