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变量在之前已被赋值。如果一个整数对象没有被任何一个变量所引用,则该整数对象被系统回收。如果两个整数对象的值相同,则它们是同一个整数对象。
请你输出最终有多少个整数对象没有被回收。
现在有若干个赋值语句,每个赋值语句由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。
每一组数据第一行为一个正整数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);
}
}