1388:家谱(gen)

http://ybt.ssoier.cn:8088/problem_show.php?pid=1388

方法一:普通模拟,时间复杂度O(50000*1000)只能拿40分

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 string s;
 4 string pep[50010];//存放名字 
 5 int fa[50010];//记录他的祖先,默认值为0时本人就是祖先 
 6 
 7 int main()
 8 {
 9     int i=0;
10     int f=-1;
11     while(1){
12         cin>>s;
13         if(s.length()==1 && s=="$")break;//结束条件 
14         if(s[0]=='#'){//如果是父亲 
15             int t=0; //判断是否已经存在 
16             for(int j=1; j<=i; j++){//从家谱中找 
17                 if(pep[j]==s.substr(1)){
18                     t=j; break;
19                 }
20             }
21             if(!t){//如果不在家谱中,插入 
22                 i++;
23                 pep[i]=s.substr(1);
24                 f=i;
25             }
26             else//在家谱中,记录他的位置下标 
27                 f=t;
28         }
29         if(s[0]=='+'){//如果是孩子 
30             i++;
31             pep[i]=s.substr(1);//插入到家族 
32 //            cout<<i<<":"<<pep[i]<<endl;
33             while(fa[f])f=fa[f];//寻找这个孩子的祖先 
34             fa[i]=f;//标记祖先下标 
35         }
36         if(s[0]=='?'){
37             
38             int t;
39             cout<<s.substr(1)<<" ";
40             for(int j=1; j<=i; j++){//查找存储下标 
41                 if(pep[j]==s.substr(1)){
42                     t=j; break;
43                 }
44             }
45             if(fa[t]==0)cout<<pep[t]<<endl;//如果祖先是0说明就是祖先 
46             else cout<<pep[fa[t]]<<endl;//否则输出祖先 
47         }
48     }
49     return 0;
50 } 

方法一:

上一篇:PHP协程使用场景


下一篇:Jittor实现Conditional GAN