在储存单词时,我们可以使用链表逐个字母进行储存。
为了节约空间,如果两个单词拥有共同的后缀,那么可以让它们共享一个相同的子链表。
例如,loading 和 being 可以如下图所示储存:
ef0a1fdf-3d9f-46dc-9a27-21f989270fd4.jpg
你需要找到共同后缀的起始位置。(对于上图,即为 ii 的位置)
补充
本题中可能包含不在链表中的节点,这些节点无需考虑。
输入格式
第一行包含两个节点地址和一个正整数 NN,两个地址分别是两个单词的首字母节点地址,NN 是总节点数量。
节点地址是一个 55 位数字,各位都是正整数。
NULL 的地址为 −1−1。
接下来 NN 行,每行包含一个节点信息,如下所示:
Address Data Next
其中 Address 是当前节点的地址,Data 是节点储存的字母(a∼z,A∼Za∼z,A∼Z),Next 是下一个节点的地址。
输出格式
如果存在共同后缀,则输出共同后缀的起始位置节点地址。
如果不存在共同后缀,则输出 -1。
数据范围
2≤N≤1052≤N≤105
输入样例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
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int e[N],ne[N],flag[N];;
int main(){
int h1,h2,n;
cin>>h1>>h2>>n;
while(n--){
int address,next;
char data;
cin>>address>>data>>next;
e[address]=data;
ne[address]=next;
}
for(int i=h1;i!=-1;i=ne[i]){
flag[i]=1;
}
for(int i=h2;i!=-1;i=ne[i]){
if(flag[i]==1){
printf("%05d", i);
return 0;
}
}
cout<<-1;
return 0;
}