PAT甲级真题1032 共享(链表简单解法)

在储存单词时,我们可以使用链表逐个字母进行储存。

为了节约空间,如果两个单词拥有共同的后缀,那么可以让它们共享一个相同的子链表。

例如,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;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王子y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值