题目
To store English words, one method is to use linked lists and store a word letter by letter. To save some space, we may let the words share the same sublist if they share the same suffix. For example, loading
and being
are stored as showed in Figure 1.
Figure 1
You are supposed to find the starting position of the common suffix (e.g. the position of i
in Figure 1).
Input Specification:
Each input file contains one test case. For each case, the first line contains two addresses of nodes and a positive N (≤105), where the two addresses are the addresses of the first nodes of the two words, and N is the total number of nodes. The address of a node is a 5-digit positive integer, and NULL is represented by −1.
Then N lines follow, each describes a node in the format:
1 | Address Data Next |
whereAddress
is the position of the node, Data
is the letter contained by this node which is an English letter chosen from { a-z, A-Z }, and Next
is the position of the next node.
Output Specification:
For each case, simply output the 5-digit starting position of the common suffix. If the two words have no common suffix, output -1
instead.
Sample Input 1:
1 | 11111 22222 9 |
Sample Output 1:
1 | 67890 |
Sample Input 2:
1 | 00001 00002 4 |
Sample Output 2:
1 | -1 |
题解
思路
- 我们不关心字母本身是什么,关心的是地址。
- 建立一个哈希表,键是这个字母的地址,值是下一个字母的地址。
- 也可以开一个足够大的数组,但是这样不够优雅。
- 遍历第一个单词,把每一个字母地址添加到一个哈希集中
- 遍历第二个单词,如果一个字母地址出现在哈希集当中,说明重合了。
数据结构
- next 是一个字典(哈希表)
- 键是整型的,代表字母地址
- 值也是整型,代表这个字母下一个字母的地址
- A 是一个哈希集
- 存放第一个单词的所有字目的地址
- addr 是遍历的临时变量
算法
- 都写在思路里了。
代码
- 使用Python的话最后一个点会超时。因此两个语言都写了。要注意使用字符串作为哈希键的话,C++也会超时。应该使用整数作为键,同时输出的时候补0。
Python
1 | # 读入数据与数据结构初始化 |
C++
1 |
|