add a1022, a1032

This commit is contained in:
Oliver Lew
2020-04-26 16:46:48 +08:00
parent 89028a2524
commit 856567f179
6 changed files with 581 additions and 0 deletions
+120
View File
@@ -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 %}```
+64
View File
@@ -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 %}```
+12
View File
@@ -0,0 +1,12 @@
<!--
2020-04-26 15:32:53 +0800
-->
数据的存储与查询。
使用了最简单暴力的结构数组来存储,然后简单地按照ID排下序,遍历数组核对就行了。
这样写是很简单的,如果要使用复杂的数据结构肯定会更快。
作为参考:最后一个测试点用了660毫秒,上限为1200。
+22
View File
@@ -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
+150
View File
@@ -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.
![fig.jpg](https://images.ptausercontent.com/ef0a1fdf-3d9f-46dc-9a27-21f989270fd4.jpg)
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;
}
```