这题表面上是要求后缀相同的首地址,其实只需要求得第一个相同的地址就行,因为如果出现了地址相同的字母,那么后面的字母就一定都相同,他们的路线是相同的,故问题的关键是,找到第一个路径出现相同的地址(遍历完第一条路径后遍历第二条路径,输出第一次相等的情况)。
输入1:
11111 22222 9
67890 i 00002
00010 a 12345
00003 g -1
12345 D 67890
00002 n 00003
22222 B 23456
11111 L 00001
23456 e 67890
00001 o 00010
输出1:
67890
输入2:
00001 00002 4
00001 a 10001
10001 s -1
00002 a 10002
10002 t -1
输出2:
-1
代码1——使用结构体:
#include<stdio.h>
const int maxn = 100010;
struct Node{
char data;
int next;
bool flag;
}node[maxn];
int main(){
int a1, a2, n;
scanf("%d %d %d", &a1, &a2, &n);
int address, next_address;
char dat;
for(int i=0;i<n;i++){
scanf("%d %c %d", &address, &dat, &next_address);
node[address].data = dat;
node[address].next = next_address;
node[address].flag = false;
}
int p;
for(p=a1;p!=-1;p=node[p].next){
node[p].flag = true; //在第一条序列中出现的字母的flag为真
}
for(p=a2;p!=-1;p=node[p].next){
if(node[p].flag==true) break;
}
if(p==-1){
printf("-1");
return 0;
}
printf("%05d",p);
return 0;
}
代码2——不使用结构体:
#include<stdio.h>
using namespace std;
int hashTable[99999]={0};
bool ans[99999] = {false};
char data[99999];
int main(){
int n1, n2, N;
int addr, nex;
char dat;
scanf("%d %d %d",&n1,&n2,&N);
for(int i=0;i<N;i++){
scanf("%d %c %d",&addr,&dat,&nex);
hashTable[addr] = nex;
data[addr] = dat;
}
while(n1!=-1){
ans[n1] = true;
n1 = hashTable[n1];
// printf("%d\n",n1);
}
while(n2!=-1){
if(ans[n2]==true){
printf("%05d",n2);
return 0;
}
n2 = hashTable[n2];
}
if(n2==-1) printf("-1");
return 0;
}
附上AC截图: