Problem H. 公孙玉龙

Problem H. 公孙玉龙

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 280    Accepted Submission(s): 57


Problem Description
公孙玉龙创造了一门动态类型编程语言,他想出了一种垃圾回收的方式。
现在有若干个赋值语句,每个赋值语句由a和b组成。变量名仅由小写和大写字母组成,已知a是一个变量名。整数对象为长度不超过100的整数。如果b是一个整数对象,那么表示b整数对象被a所引用。如果b是一个变量名,那么表示a引用b所引用的整数对象,并且保证b变量在之前已被赋值。如果一个整数对象没有被任何一个变量所引用,则该整数对象被系统回收。如果两个整数对象的值相同,则它们是同一个整数对象。
请你输出最终有多少个整数对象没有被回收。
 

Input
第一行包含一个正整数T(1≤T≤100)代表测试数据组数。
每一组数据第一行为一个正整数n(1≤n≤100),接下来n行每行由a,b组成,表示将b赋值给a,其中a为变量名,b为变量名或一个整数对象,1≤|a|,|b|≤100。
 

Output
对于每一组数据,输出最终有多少个整数对象没有被回收。
 

Sample Input
 
  
2 3 TNT 2 SNS 3 BNB 3 5 T 2 N 2 T N S 3 B 3
 

Sample Output
 
  
2 2
 

Source
 
  
陈都测试2

用map标记记录

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
char s[1000][1000];
map<string,string> mp;
map<string,int> mp1;
int f(char x[]){
    int flag=1;
    int len=strlen(x);
    for(int i=0;i<len;i++){
        if(x[i]=='-'&&i==0){continue;}
        else if(x[i]>'9'||x[i]<'0'){return 0;}
    }
    return 1;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        mp.clear();
        mp1.clear();
        for(int i=0;i<n;i++){
            char a[200],b[200];
            scanf("%s %s",a,b);
            if(f(b)){mp[a]=b;}
            else{mp[a]=mp[b];}
    
        }
        map<string,string>::iterator it;
        int res=0;
        for(it=mp.begin();it!=mp.end();it++)
        {
            if(!mp1[it->second]){res++;mp1[it->second]=1;}
        }
        printf("%d\n",res);
    }
}

猜你喜欢

转载自blog.csdn.net/qibage/article/details/81054167