diff --git a/_articles/a1022.md b/_articles/a1022.md new file mode 100644 index 0000000..1721073 --- /dev/null +++ b/_articles/a1022.md @@ -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 +#include +#include + +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 %}``` \ No newline at end of file diff --git a/_articles/a1032.md b/_articles/a1032.md new file mode 100644 index 0000000..4278ca6 --- /dev/null +++ b/_articles/a1032.md @@ -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 + +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 %}``` \ No newline at end of file diff --git a/_articles/analysis/a1022.md b/_articles/analysis/a1022.md new file mode 100644 index 0000000..461aee8 --- /dev/null +++ b/_articles/analysis/a1022.md @@ -0,0 +1,12 @@ + + +数据的存储与查询。 + +使用了最简单暴力的结构数组来存储,然后简单地按照ID排下序,遍历数组核对就行了。 + +这样写是很简单的,如果要使用复杂的数据结构肯定会更快。 + +作为参考:最后一个测试点用了660毫秒,上限为1200。 diff --git a/_articles/analysis/a1032.md b/_articles/analysis/a1032.md new file mode 100644 index 0000000..bc4ee37 --- /dev/null +++ b/_articles/analysis/a1032.md @@ -0,0 +1,22 @@ + + +一个链表相关的题目。 + +依然暴力地(再次说明,很不实用。不过最坏情况就需要这么多,所以对于OJ来说,不算浪费)申请一个100000长度的数组,直接用数组索引作为链表地址。 + +思路很简单: +``` +记录链表: + 结构数组[Address] => 结构数组[Next] +遍历第一个单词: + 标记所有遍历的结点 +遍历第二个单词: + 输出第一个被标记的结点 +``` + +我定义的结构只有下一个结点的地址和一个标记,没有记录字符,因为你会发现它没用。。。 + +**盲点**:单词开头地址可能为`NULL`。盲生,你是否发现这个了华点? diff --git a/_articles/others/a1022.md b/_articles/others/a1022.md new file mode 100644 index 0000000..b4a1b66 --- /dev/null +++ b/_articles/others/a1022.md @@ -0,0 +1,213 @@ +### 我的PAT系列文章更新重心已移至Github,欢迎来看PAT题解的小伙伴请到[Github Pages](https://oliverlew.github.io/PAT)浏览最新内容([本篇文章链接](https://oliverlew.github.io/PAT/Advanced/1022.html))。此处文章目前已更新至与Github Pages同步。欢迎star我的[repo](https://github.com/OliverLew/PAT)。 + +## 题目 + +A Digital Library contains millions of books, stored according to their +titles, authors, key words of their abstracts, publishers, and published +years. Each book is assigned an unique 7-digit number as its ID. Given any +query from a reader, you are supposed to output the resulting books, sorted in +increasing order of their ID's. + +### Input Specification: + +Each input file contains one test case. For each case, the first line contains +a positive integer $N$ ( $\le 10^4$ ) which is the total number of books. Then +$N$ blocks follow, each contains the information of a book in 6 lines: + + * Line #1: the 7-digit ID number; + * Line #2: the book title -- a string of no more than 80 characters; + * Line #3: the author -- a string of no more than 80 characters; + * Line #4: the key words -- each word is a string of no more than 10 characters without any white space, and the keywords are separated by exactly one space; + * Line #5: the publisher -- a string of no more than 80 characters; + * Line #6: the published year -- a 4-digit number which is in the range [1000, 3000]. + +It is assumed that each book belongs to one author only, and contains no more +than 5 key words; there are no more than 1000 distinct key words in total; and +there are no more than 1000 distinct publishers. + +After the book information, there is a line containing a positive integer $M$ +( $\le 1000$ ) which is the number of user's search queries. Then $M$ lines +follow, each in one of the formats shown below: + + * 1: a book title + * 2: name of an author + * 3: a key word + * 4: name of a publisher + * 5: a 4-digit number representing the year + +### Output Specification: + +For each query, first print the original query in a line, then output the +resulting book ID's in increasing order, each occupying a line. If no book is +found, print `Not Found` instead. + +### Sample Input: + + + + 3 + 1111111 + The Testing Book + Yue Chen + test code debug sort keywords + ZUCS Print + 2011 + 3333333 + Another Testing Book + Yue Chen + test code sort keywords + ZUCS Print2 + 2012 + 2222222 + The Testing Book + CYLL + keywords debug book + ZUCS Print2 + 2011 + 6 + 1: The Testing Book + 2: Yue Chen + 3: keywords + 4: ZUCS Print + 5: 2011 + 3: blablabla + + +### Sample Output: + + + + 1: The Testing Book + 1111111 + 2222222 + 2: Yue Chen + 1111111 + 3333333 + 3: keywords + 1111111 + 2222222 + 3333333 + 4: ZUCS Print + 1111111 + 5: 2011 + 1111111 + 2222222 + 3: blablabla + Not Found + + + + +## 思路 + + +数据的存储与查询。 + +使用了最简单暴力的结构数组来存储,然后简单地按照ID排下序,遍历数组核对就行了。 + +这样写是很简单的,如果要使用复杂的数据结构肯定会更快。 + +作为参考:最后一个测试点用了660毫秒,上限为1200。 + +## 代码 + +[最新代码@github](https://github.com/OliverLew/PAT/blob/master/PATAdvanced/1022.c),欢迎交流 +```c +#include +#include +#include + +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; +} +``` \ No newline at end of file diff --git a/_articles/others/a1032.md b/_articles/others/a1032.md new file mode 100644 index 0000000..03f7eda --- /dev/null +++ b/_articles/others/a1032.md @@ -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 + +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; +} +``` \ No newline at end of file