PAT Advanced 1032 Sharing(25) [链表]
题目
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 sufix. For example, “loading” and “being” are stored as showed 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:
Address Data Next
where Address 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 sufix. If the two words have no common sufix, output “-1” instead.
Sample Input 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
Sample Output 1:
67890
Sample Input 2:
00001 00002 4
00001 a 10001
10001 s -1
00002 a 10002
10002 t -1
Sample Output 2:
-1
题目分析
两个链表,有共同后缀,找出共同后缀的第一个节点的地址
解题思路
思路01(最优)
- 定义Node结构体,记录每个节点信息(地址,data,next指针),用map记录映射关系<地址,节点>方便O(1)查找(可以使用大数组代替,下标及地址,元素值记录next)
- 遍历第一个链表,出现过的元素标记为1
- 遍历第二个链表,若其节点在第一个链表中出现过(即:标记=1),则打印,若链表2中没有在链表1中出现过的节点,打印-1
思路02
- 定义Node结构体,记录每个节点信息(地址,data,next指针),用map记录映射关系<地址,节点>方便O(1)查找(可以使用大数组代替,下标及地址,元素值记录next)
- 分别计算两个链表的长度
- 先遍历长链表到其长度跟短链表长度相等
- 同时遍历两个链表,找出相同节点,若有相同节点,打印其地址,若无相同节点,打印-1;
思路03(该思路错误,列出来为了下次不再这样思考)
1. 记录输入的每个样例的next,如果有next出现两次,即为相同节点(×);如果其中一个链表的起点是另一个链表的节点(即任意一个链表的起点在另外一个链表中出现过)(测试点2,4,5错误)
注:网上其他朋友有说 一个错误情况为格式,必须为5个字符
Code
Code 01
#include <iostream>
#include <list>
#include <unordered_map>
using namespace std;
struct node {
string adr;
char data;
string next;
bool flag=false;
};
int main(int argc,char * argv[]) {
string s1,s2;
int d;
char c;
node n;
cin>>s1>>s2>>d;
unordered_map<string,node> m; //用map最后一个点会超时
for(int i=0; i<d; i++) {
cin>>n.adr>>n.data>>n.next;
m[n.adr]=n;
}
string n1=s1;
while(n1!="-1") {
m[n1].flag=true;
n1=m[n1].next;
}
string n2=s2;
while(n2!="-1") {
if(m[n2].flag) {
break;
}
n2=m[n2].next;
}
printf("%s",n2.c_str());
return 0;
}
Code 02
#include <iostream>
#include <list>
#include <unordered_map>
using namespace std;
struct node {
string adr;
char data;
string next;
bool flag=false;
};
int main(int argc,char * argv[]) {
string s1,s2;
int d;
char c;
node n;
cin>>s1>>s2>>d;
unordered_map<string,node> m; //用map最后一个点会超时
for(int i=0; i<d; i++) {
cin>>n.adr>>n.data>>n.next;
m[n.adr]=n;
}
int len1=0,len2=0;
string n1=s1;
while(n1!="-1") {
n1=m[n1].next;
len1++;
}
string n2=s2;
while(n2!="-1") {
n2=m[n2].next;
len2++;
}
n1=s1,n2=s2;
while(len1>len2) {
len1--;
n1=m[n1].next;
}
while(len1<len2) {
len2--;
n2=m[n2].next;
}
while(n1!=n2){
n1=m[n1].next;
n2=m[n2].next;
}
printf("%s",n1.c_str());
return 0;
}
PAT Advanced 1032 Sharing(25) [链表]的更多相关文章
- PAT 甲级 1032 Sharing (25 分)(结构体模拟链表,结构体的赋值是深拷贝)
1032 Sharing (25 分) To store English words, one method is to use linked lists and store a word let ...
- 【PAT】1032 Sharing (25)(25 分)
1032 Sharing (25)(25 分) To store English words, one method is to use linked lists and store a word l ...
- PAT甲 1032. Sharing (25) 2016-09-09 23:13 27人阅读 评论(0) 收藏
1032. Sharing (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue To store Engl ...
- PAT甲题题解-1032. Sharing (25)-链表水题
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...
- PAT 1032 Sharing[hash][链表][一般上]
1032 Sharing (25)(25 分) To store English words, one method is to use linked lists and store a word l ...
- 1032 Sharing (25分)
1032 Sharing (25分) 题目 思路 定义map存储所有的<地址1,地址2> 第一set存放单词1的所有地址(通过查找map) 通过单词二的首地址,结合map,然后在set中查 ...
- PAT (Advanced Level) 1032. Sharing (25)
简单题,不过数据中好像存在有环的链表...... #include<iostream> #include<cstring> #include<cmath> #inc ...
- 1032 Sharing (25分)(数组链表)
To store English words, one method is to use linked lists and store a word letter by letter. To save ...
- PAT 1032 Sharing (25分) 从自信到自闭
题目 To store English words, one method is to use linked lists and store a word letter by letter. To s ...
随机推荐
- 一百零三、SAP中常量的定义CONSTANTS
一.代码如下 二.运行效果如下
- js原型链理解(4)-经典继承
经典继承就是组合继承,就是组合构造函数和原型链的优点混合继承. 1.避免引用类型的属性初始化 2.避免相同方法的多次初始化 function Super(name){ this.ages = [100 ...
- Day 21:网络编程(2)
以课程中feiQ为例,feiQ作为一个典型的网络编程应用,用一段代码尝试给自己的发送消息 import java.io.IOException; import java.net.DatagramPac ...
- android 开发学习3
DAO:DATA ACCESS OBJECT getApplication()和MainActivity.this 是两种不同的context,也是最常见的两种.第一种中context的生命周期与Ap ...
- 【剑指Offer】面试题10- II. 青蛙跳台阶问题
题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返 ...
- UVA - 1153 Keep the Customer Satisfied(顾客是上帝)(贪心)
题意:有n(n<=800000)个工作,已知每个工作需要的时间qi和截止时间di(必须在此之前完成),最多能完成多少个工作?工作只能串行完成.第一项任务开始的时间不早于时刻0. 分析:按截止时间 ...
- 51nod 算法马拉松3 A:序列分解
序列分解 System Message (命题人) 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 小刀和大刀是双胞胎兄弟.今天他们玩一个有意思的游戏. 大刀给小刀准备了一个长度为n ...
- windows driver 枚举串口
//枚举串口 NTSTATUS status; HANDLE hKey = NULL; OBJECT_ATTRIBUTES oa; UNICODE_STRING strPath = RTL_CONST ...
- 将java项目转成svn项目
1.需要工具:eclipse / svn插件 2.在需要共享的项目上右键-->team-->Share Project分享项目 3.选择svn 如果需要共享成cvs选择cvs即可. 4.选 ...
- Arduino - Nano针脚分配时需要注意的事项
0.1为Rx.Tx 针脚,这两个针脚一般作为串口使用,非串口设备尽量不占用该针脚.2.3为中断口,分别对应中断0.中断1,需要中断功能的设备,必须接入此.2-13.A0-A5,共18个针脚,都可以作为 ...