题目很简单,就是一道模拟,自己比赛时也写出来了,结果没有考虑到longlong的问题,本来也想到了,结果因为WA的次数太多,最后10分钟的时候没有换,哎还是不自信。
简直服气。竟然只是因为这个。。
思路:通过程序模块化,不要全写在main里面。实现变量的赋值和拷贝函数。
代码如下:
#include<iostream>
#include<cstring>
#include<cmath>
#include<string>
#include<set>
#include<vector>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
string op[12] = { "AX","BX","CX","DX","AH","BH","CH","DH","AL","BL","CL","DL" };
ll A[15], N;
const ll Mod = 256;
int GetNum(string str) {
for (int i = 0; i<12; ++i) {
if (str == op[i])
return i;
}
return -1;
}
void init() {
memset(A, 0, sizeof(A));
}
void Change(string s, ll v) {
int num = GetNum(s);
int l, m, r;
if (num < 4) {
l = num, m = num + 4, r = num + 8;
A[l] = v;
A[m] = v / Mod;
A[r] = v % Mod;
}
else if (num < 8) {
l = num - 4, m = num, r = num + 4;
A[m] = v;
A[l] = A[m] * Mod + A[r];
}
else {
l = num - 8, m = num - 4, r = num;
A[r] = v;
A[l] = A[m] * Mod + A[r];
}
}
void Copy(string s, string p) {
int r = GetNum(p);
ll v = A[r];
Change(s, v);
}
bool isnum(char ch) {
if ('0' <= ch && ch <= '9')
return true;
return false;
}
ll Transform(string str) {
int len = (int)str.length();
char last = str[len - 1];
ll res = 0;
if (last == 'B') {
for (int i = 0; i<len - 1; ++i) {
ll v = (int)(str[i] - '0');
res = res * 2 + v;
}
}
else if (last == 'H') {
for (int i = 0; i<len - 1; ++i) {
ll v;
if (isnum((char)str[i]))
v = (int)(str[i] - '0');
else {
if ('A' <= str[i] && str[i] <= 'Z')
str[i] += 32;
v = (int)(str[i] - 'a') + 10;
}
res = res * 16 + v;
}
}
else {
for (int i = 0; i<len; ++i) {
ll v = (int)(str[i] - '0');
res = res * 10 + v;
}
}
return res;
}
int main(void) {
int T;
cin >> T;
while (T--) {
init();
cin >> N;
string str, AA, BB;
for (int i = 1; i <= N; ++i) {
cin >> str;
if (str == "MOV") {
string temp;
cin >> temp;
int pos = 0;
AA.clear(), BB.clear();
for (pos = 0; pos<temp.length(); ++pos) {
if (temp[pos] == ',')
break;
AA += temp[pos];
}
for (pos = pos + 1; pos < temp.length(); ++pos)
BB += temp[pos];
int r = GetNum(BB);
if (r == -1) {
Change(AA, Transform(BB));
}
else {
Copy(AA, BB);
}
}
else if (str == "ADD") {
string temp;
cin >> temp;
int pos = 0;
AA.clear(), BB.clear();
for (pos = 0; pos<temp.length(); ++pos) {
if (temp[pos] == ',')
break;
AA += temp[pos];
}
for (pos = pos + 1; pos < temp.length(); ++pos)
BB += temp[pos];
int r = GetNum(BB);
if (r == -1) {
ll v = Transform(BB) + A[GetNum(AA)];
Change(AA, v);
}
else {
ll v = A[GetNum(AA)] + A[GetNum(BB)];
Change(AA, v);
}
}
else {
cin >> BB;
int pos = GetNum(BB);
if (pos < 4) {
ll v = A[pos];
ll res = v * A[0];
Change("DX", res / (Mod*Mod));
Change("AX", res % (Mod*Mod));
}
else {
ll v = A[pos];
ll res = v * A[8];
Change("AX", res);
}
}
}
for (int i = 0; i<4; ++i) {
cout << A[i];
if (i != 3)
cout << " ";
else
cout << endl;
}
}
return 0;
}