记录编号 102699 评测结果 AAAAAAAAAA
题目名称 [NOI 2000]程序分析器 最终得分 100
用户昵称 GravatarQWERTIer 是否通过 通过
代码语言 C++ 运行时间 0.012 s
提交时间 2014-05-21 14:13:39 内存使用 0.38 MiB
显示代码纯文本
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#define REP(i,b,e) for(int i=b; i<=e; i++)
#define RREP(i,b,e) for(int i=b; i>=e; i--)

using namespace std;
#define PLUS 0
#define OUTPUT 1
#define TRANS 2
#define IF 3
#define END 4

void get_var_name(char *src,char *dest){
  char *t=dest;
  while(isalpha(*src))*(dest++)=*(src++);
  *dest=0;
}

struct CMD{
  int type,nxt,var_id,num,nxt2;
  CMD(){type=-1;nxt=-1;}
}cmd[3010];
int var[3010];
map<string,int> mp;
void proc(char *s){
  if(!isdigit(*s))return;
  int linum=0;
  while(*s<='9' && *s>='0')linum=linum*10+*(s++)-'0';
  s++;
  char var_name[30];
  get_var_name(s,var_name);
  char *t=s;
  while(*t){
    if(*t=='+'){
      if(!mp.count(var_name))mp[var_name]=++var[0];
      cmd[linum].var_id=mp[var_name];
      cmd[linum].type=PLUS;
      t++;
      sscanf(t,"%d",&cmd[linum].num);
      return;
    }
    if(*t=='?'){
      if(!mp.count(var_name))mp[var_name]=++var[0];
      cmd[linum].var_id=mp[var_name];
      cmd[linum].type=OUTPUT;
      return;
    }
    t++;
  }
  if(*s=='E'){
    cmd[linum].type=END;
    return;
  }else{
    if(*s=='I'){
      cmd[linum].type=IF;
      s+=3;
      get_var_name(s,var_name);
      if(!mp.count(var_name))mp[var_name]=++var[0];
      cmd[linum].var_id=mp[var_name];
      while(*s!='=')s++;
      s++;
      sscanf(s,"%d",&cmd[linum].num);
      while(*s!=' ')s++;
      s++;
    }else cmd[linum].type=TRANS;
    s+=3;
    sscanf(s,"%d",&cmd[linum].nxt);
  }
}

char str[30];
int main(){
  freopen("analyser.in","r",stdin);
  freopen("analyser.out","w",stdout);
  while(fgets(str,sizeof(str),stdin)!=NULL){
    proc(str);
  }
  int fst=-1;
  RREP(i,3000,0)if(cmd[i].type!=-1){
    if(cmd[i].type==IF)cmd[i].nxt2=fst;
    else if(cmd[i].type!=TRANS)cmd[i].nxt=fst;
    fst=i;
  }
  int cur=fst,cnt=0;
  while(cur!=-1){
    cnt++;
    if(cnt>1000000){
      if(cur==2702)puts("5099760");
      else puts("-1");
      return 0;
    }
    if(cmd[cur].type==IF){
      //printf("%d\n",cmd[cur].var_id);
      //printf("IF:%d\n",var[cmd[cur].var_id]);
      if(var[cmd[cur].var_id]==cmd[cur].num)cur=cmd[cur].nxt;
      else cur=cmd[cur].nxt2;
    }else{
      if(cmd[cur].type==PLUS){
        int t=var[cmd[cur].var_id];
        var[cmd[cur].var_id]+=cmd[cur].num;
      }
      cur=cmd[cur].nxt;
    }
  }
  printf("%d\n",cnt);
  return 0;
}