点击打开题目链接
找第一个bug所在行
bug:
1.数组越界
2.使用未初始化的数组元素
两个map,分别存取数组的大小和某一元素的值。处理嵌套数组时可以递归,也可以从串最后往前迭代遍历。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = 1e15;
map<int, int> mp;//数组元素大小
map<int, map<int, int> > ass;//数组元素值
char str[100000];
int toIndex(char c) {
if(isupper(c)) return c - 'A' + 26;
else return c - 'a';
}
int toInt(char s[]) {
int a = 0;
if(isdigit(s[0])) {
for(int i = 0; s[i] != ']' && i != strlen(s); i++) {
a *= 10;
a += s[i] - '0';
}
}
else {
for(int i = 2; s[i] != ']' && i != strlen(s); i++) {
a *= 10;
a += s[i] - '0';
}
}
return a;
}
ll isLegalR(char s[], int t) {
ll tmp = maxn, flag = 1;
int len = strlen(s) - 1;
while(len > t) {
while(len > t && !isalpha(s[len])) len--;
if(len == t) {
tmp = toInt(s + len + 1);
break;
}
if(tmp == maxn) tmp = toInt(s + len);
if(mp.count(toIndex(s[len])) && mp[toIndex(s[len])] > tmp && ass.count(toIndex(s[len])) && ass[toIndex(s[len])].count(tmp))
tmp = ass[toIndex(s[len])][tmp];
else {
flag = 0;
break;
}
len--;
}
if(flag) return tmp;
else return maxn;
}
ll isLegalL(char s[], int t, int ans) {
ll tmp = maxn, flag = 1;
int len = t - 1;
while(len >= 3) {
while(len >= 3 && !isalpha(s[len])) len--;
if(isdigit(s[len])) {
tmp = toInt(s+2);
break;
}
if(tmp == maxn) tmp = toInt(s + len);
if(mp.count(toIndex(s[len])) && mp[toIndex(s[len])] > tmp && ass.count(toIndex(s[len])) && ass[toIndex(s[len])].count(tmp))
tmp = ass[toIndex(s[len])][tmp];
else {
flag = 0;
break;
}
len--;
}
if(flag && mp.count(toIndex(s[0])) && mp[toIndex(s[0])] > tmp) {
ass[toIndex(s[0])][tmp] = ans;
return tmp;
}
else return maxn;
}
int isLegal(char s[]) {
int t = strchr(s, '=') - s;
ll ans = isLegalR(s, t);
if(ans != maxn) {
ll tag = isLegalL(s, t, ans);
if(tag != maxn) return 1;
}
return 0;
}
int main() {
//ios::sync_with_stdio(false);
while(cin >> str) {
ass.clear();mp.clear();
int cnt = 1;
int flag = 0;
if(str[0] == '.') break;
if(strchr(str, '=') == 0) {
mp[toIndex(str[0])] = max(toInt(str), mp[toIndex(str[0])]);
}
else flag = 1;
while(cin >> str) {
cnt++;
if(str[0] == '.') break;
if(strchr(str, '=') == 0) {
mp[toIndex(str[0])] = max(toInt(str), mp[toIndex(str[0])]);
}
else {
int pag = isLegal(str);
if(pag == 0 && !flag) flag = cnt;
}
}
cout << flag << endl;
}
return 0;
}