1032 Sharing (25分)

 

这题第四个测试点是格式控制...其实看题的时候就想到要注意这一点,写着写着就忘了。cin,cout依然容易超时。刚开始第20行写成 scanf("%d%c%d",&add1,&NODE.c,&NODE.next);  没办法正常读取,想来是因为NODE.c吸收了空格?后来改成 scanf("%d %c %d",&add1,&NODE.c,&NODE.next);  就好了。我依然不敢开大数组...柳神开了个10的5次方的数组...大手笔。也不知道数组大小有无上限。我对这题的想法是:用结构体和map存储节点信息,包含下一节点的地址和该节点在两个单词出现的次数。遍历第一个单词,令其所有节点cnt为1。再遍历第二个单词,令其节点cnt自增1。当发现了第一个cnt为2即出现次数等于2的节点,找到了题目要求的地址。这样的思路其实有缺陷,但可以过所有测试点,应该是测试点太单一了...如果这题可以说简单,那就是因为测试点设置的不够好...

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<string>
 4 #include<map>
 5 using namespace std; 
 6 struct node{
 7     int next,cnt;
 8     char c;
 9     node(){next=cnt=0;
10     }
11 };
12 int main()
13 {   
14   int s1,s2,n;
15   scanf("%d%d%d\n",&s1,&s2,&n);
16   map<int,node> origin;
17   node NODE;
18   int add1;
19   for(int i=0;i<n;i++){
20       scanf("%d %c %d",&add1,&NODE.c,&NODE.next); 
21      origin[add1]=NODE; 
22   }
23   int temp=s1;
24   while(temp!=-1){
25     origin[temp].cnt++;
26     temp=origin[temp].next;
27   }
28   temp=s2;
29   int flag=0,res=0;
30   while(temp!=-1){
31     origin[temp].cnt++;
32     if(origin[temp].cnt==2){
33         flag=1;
34         res=temp;
35         break;
36     }
37     temp=origin[temp].next;
38   }
39   if(flag==1)
40     printf("%05d",temp);
41     
42   else
43    cout<<"-1";
44   return 0;
45 }

 

posted @ 2020-03-26 20:02  wsshub  阅读(242)  评论(0)    收藏  举报