mirror of
https://github.com/xlucn/PAT.git
synced 2026-10-03 00:23:15 +08:00
add a1022, a1032
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
---
|
||||
layout: post
|
||||
date: 2020-04-26 15:32:53 +0800
|
||||
title: "PAT Advanced 1022. Digital Library (30) (C语言实现)"
|
||||
categories: Advanced
|
||||
tags: []
|
||||
permalink: Advanced/1022.html
|
||||
---
|
||||
|
||||
## 题目
|
||||
|
||||
{% include_relative html/a1022.md %}
|
||||
|
||||
## 思路
|
||||
|
||||
{% include_relative analysis/a1022.md %}
|
||||
|
||||
## 代码
|
||||
|
||||
[Github最新代码](https://github.com/OliverLew/PAT/blob/master/PATAdvanced/1022.c),欢迎交流
|
||||
|
||||
```c
|
||||
{% raw %}#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
typedef struct book {
|
||||
int ID;
|
||||
char title[81];
|
||||
char author[81];
|
||||
char keywords[5][11];
|
||||
char publisher[81];
|
||||
int year;
|
||||
} Book;
|
||||
|
||||
int cmpbyid(const void *a, const void *b)
|
||||
{
|
||||
return (*(Book**)a)->ID - (*(Book**)b)->ID;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
int N, M, count, query_type, query_year;
|
||||
char space, query_str[81];
|
||||
Book books[10000] = {0}, *p, *booksbyid[10000];
|
||||
|
||||
scanf("%d", &N);
|
||||
for(int i = 0; i < N; i++)
|
||||
{
|
||||
p = booksbyid[i] = books + i;
|
||||
scanf("%d%c", &p->ID, &space);
|
||||
scanf("%[^\n]%c", p->title, &space);
|
||||
scanf("%[^\n]%c", p->author, &space);
|
||||
space = '\0';
|
||||
for(int k = 0; space != '\n'; k++)
|
||||
scanf("%s%c", p->keywords[k], &space);
|
||||
scanf("%[^\n]%c", p->publisher, &space);
|
||||
scanf("%d", &p->year);
|
||||
}
|
||||
|
||||
qsort(booksbyid, N, sizeof(Book*), cmpbyid);
|
||||
|
||||
scanf("%d", &M);
|
||||
for(int i = 0; i < M; i ++)
|
||||
{
|
||||
count = 0;
|
||||
scanf("%d: %[^\n]%c", &query_type, query_str, &space);
|
||||
printf("%d: %s\n", query_type, query_str);
|
||||
for(int j = 0; j < N; j++)
|
||||
{
|
||||
p = booksbyid[j];
|
||||
switch(query_type)
|
||||
{
|
||||
case 1:
|
||||
if(strcmp(query_str, p->title) == 0)
|
||||
{
|
||||
printf("%07d\n", p->ID);
|
||||
count ++;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(strcmp(query_str, p->author) == 0)
|
||||
{
|
||||
printf("%07d\n", p->ID);
|
||||
count ++;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
for(int k = 0; k < 5; k ++)
|
||||
if(strcmp(query_str, p->keywords[k]) == 0)
|
||||
{
|
||||
printf("%07d\n", p->ID);
|
||||
count ++;
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if(strcmp(query_str, p->publisher) == 0)
|
||||
{
|
||||
printf("%07d\n", p->ID);
|
||||
count ++;
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
sscanf(query_str, "%d", &query_year);
|
||||
if(query_year == p->year)
|
||||
{
|
||||
printf("%07d\n", p->ID);
|
||||
count ++;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(count == 0) puts("Not Found");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
{% endraw %}```
|
||||
@@ -0,0 +1,64 @@
|
||||
---
|
||||
layout: post
|
||||
date: 2020-04-26 16:28:50 +0800
|
||||
title: "PAT Advanced 1032. Sharing (25) (C语言实现)"
|
||||
categories: Advanced
|
||||
tags: [linked list]
|
||||
permalink: Advanced/1032.html
|
||||
---
|
||||
|
||||
## 题目
|
||||
|
||||
{% include_relative html/a1032.md %}
|
||||
|
||||
## 思路
|
||||
|
||||
{% include_relative analysis/a1032.md %}
|
||||
|
||||
## 代码
|
||||
|
||||
[Github最新代码](https://github.com/OliverLew/PAT/blob/master/PATAdvanced/1032.c),欢迎交流
|
||||
|
||||
```c
|
||||
{% raw %}#include <stdio.h>
|
||||
|
||||
typedef struct Node Node;
|
||||
struct Node {
|
||||
int checked;
|
||||
struct Node *next;
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
char data;
|
||||
int start1, start2, address, next, N;
|
||||
Node list[100000] = {0}, *p;
|
||||
|
||||
scanf("%d %d %d", &start1, &start2, &N);
|
||||
/* record a linked list */
|
||||
for(int i = 0; i < N; i++)
|
||||
{
|
||||
scanf("%d %c %d", &address, &data, &next);
|
||||
list[address].next = next == -1 ? NULL : &list[next];
|
||||
}
|
||||
|
||||
if(start1 == -1 || start2 == -1)
|
||||
{
|
||||
printf("-1");
|
||||
return 0;
|
||||
}
|
||||
/* First traverse the first string */
|
||||
for(p = list + start1; p; p = p->next)
|
||||
p->checked = 1;
|
||||
/* Then traverse the second looking for checked node */
|
||||
for(p = list + start2; p && !p->checked; p = p->next)
|
||||
;
|
||||
|
||||
if(p)
|
||||
printf("%05ld", p - list);
|
||||
else
|
||||
printf("-1");
|
||||
|
||||
return 0;
|
||||
}
|
||||
{% endraw %}```
|
||||
@@ -0,0 +1,12 @@
|
||||
<!--
|
||||
2020-04-26 15:32:53 +0800
|
||||
|
||||
-->
|
||||
|
||||
数据的存储与查询。
|
||||
|
||||
使用了最简单暴力的结构数组来存储,然后简单地按照ID排下序,遍历数组核对就行了。
|
||||
|
||||
这样写是很简单的,如果要使用复杂的数据结构肯定会更快。
|
||||
|
||||
作为参考:最后一个测试点用了660毫秒,上限为1200。
|
||||
@@ -0,0 +1,22 @@
|
||||
<!--
|
||||
2020-04-26 16:28:50 +0800
|
||||
linked list
|
||||
-->
|
||||
|
||||
一个链表相关的题目。
|
||||
|
||||
依然暴力地(再次说明,很不实用。不过最坏情况就需要这么多,所以对于OJ来说,不算浪费)申请一个100000长度的数组,直接用数组索引作为链表地址。
|
||||
|
||||
思路很简单:
|
||||
```
|
||||
记录链表:
|
||||
结构数组[Address] => 结构数组[Next]
|
||||
遍历第一个单词:
|
||||
标记所有遍历的结点
|
||||
遍历第二个单词:
|
||||
输出第一个被标记的结点
|
||||
```
|
||||
|
||||
我定义的结构只有下一个结点的地址和一个标记,没有记录字符,因为你会发现它没用。。。
|
||||
|
||||
**盲点**:单词开头地址可能为`NULL`。盲生,你是否发现这个了华点?
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,150 @@
|
||||
### 我的PAT系列文章更新重心已移至Github,欢迎来看PAT题解的小伙伴请到[Github Pages](https://oliverlew.github.io/PAT)浏览最新内容([本篇文章链接](https://oliverlew.github.io/PAT/Advanced/1032.html))。此处文章目前已更新至与Github Pages同步。欢迎star我的[repo](https://github.com/OliverLew/PAT)。
|
||||
|
||||
## 题目
|
||||
|
||||
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$ ( $\le 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
|
||||
|
||||
|
||||
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
|
||||
suffix. If the two words have no common suffix, 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
|
||||
|
||||
|
||||
|
||||
|
||||
## 思路
|
||||
|
||||
|
||||
一个链表相关的题目。
|
||||
|
||||
依然暴力地(再次说明,很不实用。不过最坏情况就需要这么多,所以对于OJ来说,不算浪费)申请一个100000长度的数组,直接用数组索引作为链表地址。
|
||||
|
||||
思路很简单:
|
||||
```
|
||||
记录链表:
|
||||
结构数组[Address] => 结构数组[Next]
|
||||
遍历第一个单词:
|
||||
标记所有遍历的结点
|
||||
遍历第二个单词:
|
||||
输出第一个被标记的结点
|
||||
```
|
||||
|
||||
我定义的结构只有下一个结点的地址和一个标记,没有记录字符,因为你会发现它没用。。。
|
||||
|
||||
**盲点**:单词开头地址可能为`NULL`。盲生,你是否发现这个了华点?
|
||||
|
||||
## 代码
|
||||
|
||||
[最新代码@github](https://github.com/OliverLew/PAT/blob/master/PATAdvanced/1032.c),欢迎交流
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
typedef struct Node Node;
|
||||
struct Node {
|
||||
int checked;
|
||||
struct Node *next;
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
char data;
|
||||
int start1, start2, address, next, N;
|
||||
Node list[100000] = {0}, *p;
|
||||
|
||||
scanf("%d %d %d", &start1, &start2, &N);
|
||||
/* record a linked list */
|
||||
for(int i = 0; i < N; i++)
|
||||
{
|
||||
scanf("%d %c %d", &address, &data, &next);
|
||||
list[address].next = next == -1 ? NULL : &list[next];
|
||||
}
|
||||
|
||||
if(start1 == -1 || start2 == -1)
|
||||
{
|
||||
printf("-1");
|
||||
return 0;
|
||||
}
|
||||
/* First traverse the first string */
|
||||
for(p = list + start1; p; p = p->next)
|
||||
p->checked = 1;
|
||||
/* Then traverse the second looking for checked node */
|
||||
for(p = list + start2; p && !p->checked; p = p->next)
|
||||
;
|
||||
|
||||
if(p)
|
||||
printf("%05ld", p - list);
|
||||
else
|
||||
printf("-1");
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user