题解:
这题我们用数组来存储每个节点下个节点的地址,数组索引本身就代表结点地址 需要注意其实我们没必要存储每个节点的字符是多少,我们可以直接用地址判断两个结点是否相同。
读入所有节点后,从两个开头结点向后遍历,直至address为-1时停止,每读一个数字把这个数字压入对应单词的栈中,然后两个单词比较时每次pop一个出来比较(由于使用的是栈,所以就实现了从后往前作比较)
若比较结果为相同,则更新suffix,否则直接break;
代码:
#include <iostream>
#include<stdio.h>
#include <string>
#include<map>
#include<stack>
using namespace std;
const int maxn = 1e5+3;
char dict[maxn];
int nexts[maxn];
int main()
{
int add1,add2,N;
scanf("%d %d %d",&add1,&add2,&N);
int add,nx;
char val;
for(int j = 0;j < N;j++)
{
scanf("%d %c %d",&add,&val,&nx);
nexts[add] = nx;
}
stack<int> str1,str2;
while(add1 != -1)
{
str1.push(add1);
add1 = nexts[add1];
}
while(add2 != -1)
{
str2.push(add2);
add2 = nexts[add2];
}
int len = min(str1.size(),str2.size());
int suffix = 0;
int tmpvala,tmpvalb;
for(int i = 0;i < len;i++)
{
tmpvala = str1.top();
tmpvalb = str2.top();
if(tmpvala == tmpvalb)
{
suffix = tmpvalb;
}
else
break;
str1.pop();
str2.pop();
}
if(suffix == 0)
printf("-1");
else
{
printf("%05d",suffix);
}
return 0;
}