#include <bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
#define mem(shuzu,value) memset(shuzu,value,sizeof shuzu)
using namespace std;
const int M=10000+100;
map<string,ll>Arrays;
string str;
bool flag=true;
struct Node {
string name;
ll index;
};
ll ltos(string s) {
ll ans;
istringstream is(s);
is>>ans;
return ans;
}
bool contain(char c,string s) {
ll i =s.find(c);
return i>=0&&i<s.length();
}
Node getArray(map<string,map<ll,ll> >&single,string str) {
Node ans_node;
int last_l=str.find_last_of('[');
int last_r=str.find(']');
str[last_l]=str[last_r]='*';
ll value1=ltos(str.substr(last_l+1,last_r-1-last_l));
string name1;
//cout<<str<<endl;
while(contain('[',str)) {
int now_l=str.find_last_of('[');
int now_r=str.find(']');
name1=str.substr(now_l+1,last_l-1-now_l);
last_l=now_l,last_r=now_r;
str[last_l]=str[last_r]='*';
if(!single.count(name1)||!single[name1].count(value1)||value1>=Arrays[name1]) {
flag=0;
break;
}
//cout<<"value1:"<<value1<<endl;
value1=single[name1][value1];
//cout<<str<<",name1"<<name1<<",value"<<value1<<endl;
}
//cout<<str<<endl;
ans_node.name=str.substr(0,last_l);
ans_node.index=value1;
return ans_node;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
freopen("in.txt","r",stdin);
while(1) {
cin>>str;
if(str==".")break;
Arrays.clear();
int cnt=1;
map<string,map<ll,ll> >single;
flag=true;
while(1) {
if(flag) {
if(contain('=',str)) {
string str_value=str.substr(str.find('=')+1),str_arrayname=str.substr(0,str.find('='));
ll value;
if(contain('[',str_value)) {
Node rt=getArray(single,str_value);
if(!single.count(rt.name)||!single[rt.name].count(rt.index)||Arrays[rt.name]<=rt.index) {
flag=0;
} else {
value=single[rt.name][rt.index];
}
//cout<<"rt.name:"<<rt.name<<",rt.index:"<<rt.index<<endl;
} else {
value=ltos(str_value);
}
Node lt=getArray(single,str_arrayname);
if(!Arrays.count(lt.name)||Arrays[lt.name]<=lt.index) {
flag=0;
}
//cout<<"lt.name:"<<lt.name<<",lt.index:"<<lt.index<<",value:"<<value<<endl;
if(flag) {
single[lt.name][lt.index]=value;
} else {
cout<<cnt<<endl;
}
} else {
Node node=getArray(single,str);
//cout<<"name:"<<node.name<<",index:"<<node.index<<endl;
if(flag&&!Arrays.count(node.name)) {
Arrays[node.name]=node.index;
} else if(flag&&Arrays[node.name]<node.index) {
Arrays[node.name]=node.index;
} else if(!flag) {
cout<<cnt<<endl;
}
}
}
cin>>str;
if(str==".") {
if(flag) {
cout<<"0"<<endl;
}
break;
}
cnt++;
}
}
return 0;
}
Bug Hunt UVA - 1596
最新推荐文章于 2022-11-19 11:18:15 发布
1万+

被折叠的 条评论
为什么被折叠?



