[PAT A1032]Sharing

[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 (≤10^{5}​​), 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. 题目的意思是,对于单词在电脑中以链表的形式存储,输入每一个字母以及它的地址和下一个元素的地址,并给出两个字符串的首地址,要我们求两个字符串的公共后缀,如果有,则输出公共后缀开始的地址,如果没有则输出-1
  2. 需要注意的点就是,scanf("%d%c%d")是不对的,因为中间混了个%c,而此时空格就会被输入进去,导致出错,所以在它们之间必须添加空格
  3. 具体实现细节就是设置一个bool变量judge,如果该节点在s1中出现,就存为true,如果没有则为false,那么我们就可以通过遍历s2来找到它们的公共后缀了
  4. suffix---后缀  preffix---前缀
  5. #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) {  //把第一个字符串中出现的字符初始化为true
    		nodes[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;
    }

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值