[PAT A1032]Sharing
题目描述
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).
输入格式
Each input file contains one test case. For each case, the first line contains two addresses of nodes and a positive N (≤??), 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:
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.
输出格式
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.
输入样例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
解析
- 题目的意思是,对于单词在电脑中以链表的形式存储,输入每一个字母以及它的地址和下一个元素的地址,并给出两个字符串的首地址,要我们求两个字符串的公共后缀,如果有,则输出公共后缀开始的地址,如果没有则输出-1
- 需要注意的点就是,scanf("%d%c%d")是不对的,因为中间混了个%c,而此时空格就会被输入进去,导致出错,所以在它们之间必须添加空格
- 具体实现细节就是设置一个bool变量judge,如果该节点在s1中出现,就存为true,如果没有则为false,那么我们就可以通过遍历s2来找到它们的公共后缀了
- suffix---后缀 preffix---前缀
-
#include<iostream> #include<algorithm> using namespace std; struct node {int addr, next; //这个地方addr其实是没有必要的,多余了char data;bool judge = false; //judge初始化为false,表示它没有在第一个字符串中出现 }; node nodes[100010]; //静态链表 int main() {int addr1, addr2, n;scanf("%d %d %d", &addr1, &addr2, &n);for (int i = 0; i < n; i++) {int addr, next;char data;scanf("%d %c %d", &addr, &data, &next);nodes[addr].addr = addr;nodes[addr].data = data;nodes[addr].next = next;}while (addr1 != -1) { //把第一个字符串中出现的字符初始化为truenodes[addr1].judge = true;addr1 = nodes[addr1].next;}int ans = 0;bool t = false;while (addr2 != -1) { //遍历s2字符串if (nodes[addr2].judge != true) addr2 = nodes[addr2].next; //如果该字符为false,说明未在s1中出现,继续遍历else {ans = addr2; //记录公共子串的首地址while (addr2 != -1) {if (nodes[addr2].judge != true) break;addr2 = nodes[addr2].next;}if (addr2 == -1) t = true;}}if (t)printf("%05d", ans);else printf("-1");return 0; }