时空限制
CPU占用时长: 1秒 内存使用限制: 128MB
问题描述
要存储英语单词,一种方法是使用链表并逐字母存储单词。为了节省空间,如果单词共享相同的后缀,我们可以让它们共享相同的子链表。例如,loading和being存储如下图所示。
现在你的任务就是找到公共后缀的起始位置(例如图中 i 的位置)
输入格式
输入第一行,包含两个结点地址和结点总数n(≤105) 。
接下来n行,每行描述一个结点:address data next
其中address是结点位置,data是该结点包含的大小写字母,next是下一个结点的位置;所有地址由5个数字构成,-1表示NULL。
输出格式
输出由5个数字构成,表示公共后缀的起始位置。如果没有公共后缀,则改输出-1。
输入输出样例
样例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
输出样例
67890
样例2
输入样例
00001 00002 4
00001 a 10001
10001 s -1
00002 a 10002
10002 t -1
输出样例
-1
参考代码
#include<bits/stdc++.h>
using namespace std;
struct node{
char data; // 单词数据
int next; // 指针
bool flag; //判断标记
};
int main(){
const int N=100010;
node L[N];
int w1,w2,n;
cin>>w1>>w2>>n;
while(n--){
int address,next;char data;
cin>>address>>data>>next;
L[address]={data,next,false};
}
for(int p=w1;~p;p=L[p].next)
L[p].flag=true; //遍历第1个单词
int p=w2;
while(~p&&!L[p].flag)
p=L[p].next; //遍历第2个单词
if(~p)
cout<<setw(5)<<p<<endl;else puts("-1");
return 0;
}