目录
题目
题目链接:
1032 Sharing https://pintia.cn/problem-sets/994805342720868352/problems/994805460652113920
测试样例
输入样例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
提交结果截图
测试点分析
测试点 | 分析 |
---|---|
测试点3 | 输入的单词首地址可能是-1,要对这种情况进行处理 |
测试点4 | 注意到题目中的地址值都是5位,所以输出的时候要注意补齐5位 |
测试点5 | 题目意思表述问题,其实题目要我们求的是两个单词第一个重合的子段的首地址值,但我们理解起来可能是求两个单词的相同后缀的首地址值 |
带详细注释的源代码
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct word //结构体存储字母结点数据
{
char data;
int next;
};
int main()
{
int ad1, ad2, n, address, next;//ad1->第一个单词首字母地址,ad2->第二个单词首字母地址
char data;
vector<word>words_list(100000);//记录字母结点信息,因为地址是5位,所以数组要足够大
vector<bool>flag(100000, false);//标记字母结点是否被访问过
cin >> ad1 >> ad2 >> n;
if (ad1 == -1 || ad2 == -1)//**测试点3**, 特殊情况->存在为空的单词
{
cout << "-1" << endl;
return 0;
}
for (int i = 0; i < n; i++)//输入字母结点数据
{
cin >> address >> data >> next;
words_list[address].data = data;
words_list[address].next = next;
}
flag[ad1] = true;//标记第一个单词首字母访问过
while (1)//遍历第一个单词所有字母并进行标记
{
if (words_list[ad1].next == -1)//到了单词结尾,退出
break;
ad1 = words_list[ad1].next;//得到下一个字母的地址
flag[ad1] = true;//标记该字母访问过
}
if (flag[ad2])//如果首字母地址以及被访问过,即找到了第一个重合的字母结点
printf("%05d\n", ad2);//**测试点4**,没注意要5位错误输出:cout <<ad2 << endl;
else
while (1)//遍历第一个单词所有字母并判断是否访问过
{
if (words_list[ad2].next == -1)//到了单词结尾,退出
{
cout << "-1" << endl;//说明没有发现重合的字母结点,输出-1
break;
}
ad2 = words_list[ad2].next;//得到下一个字母的地址
if (flag[ad2])//找到了第一个重合的字母结点
{
printf("%05d\n", ad2);//**测试点4**,没注意要5位错误输出:cout << ad2 << endl;
break;
}
}
return 0;
}