这题第四个测试点是格式控制...其实看题的时候就想到要注意这一点,写着写着就忘了。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 }
原文:https://www.cnblogs.com/wsshub/p/12576942.html