PAT A1032 Sharing+静态链表初探

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 suffix. For example, loading and being are stored as showed in Figure 1.

fig.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 (≤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.

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

代码:

#include <iostream>

using namespace std;



//使用静态链表

const int maxn=100010;

struct Node{
    char data;
    int next;
    bool flag;
}node[maxn];

int main()
{
    for(int i=0;i<maxn;i++){
        node[i].flag=false;
    }
    int h1,h2,n;
    scanf("%d%d%d",&h1,&h2,&n);
    int add,next;
    char c;
    for(int i=0;i<n;i++){
        scanf("%d %c %d",&add,&c,&next);
        node[add].data=c;
        node[add].next=next;
    }
    while(h1!=-1){   //遍历链表1,将遍历过的结点设为true
        node[h1].flag=true;
        h1=node[h1].next;
    }
    while(h2!=-1){   //遍历链表2,若已访问则输出
        if(node[h2].flag){
            printf("%05d",h2);
            break;
        }else
        h2=node[h2].next;
    }
    if(h2==-1)
        cout << "-1";
    return 0;
}

 

 

### 关于PAT乙级1120题的C++解法 以下是针对PAT乙级1120题的一个可能的C++实现方法。此题的核心在于处理输入数据并按照特定规则筛选符合条件的结果。 #### 题目解析 假设该题目涉及从一组数据中找出满足某些条件的数据项,并对其进行输出。以下是一个通用的解决思路: 1. **读取输入数据**:通过标准输入获取必要的参数和数据列表。 2. **定义筛选逻辑**:基于题目描述中的具体要求设计判断函数。 3. **遍历与匹配**:逐一检查每条数据是否符合筛选条件。 4. **输出结果**:如果找到符合条件的数据则立即输出;如果没有,则输出默认提示信息。 下面是具体的代码示例以及解释: ```cpp #include <iostream> #include <vector> using namespace std; int main() { int m, n, s; // 定义变量用于存储转发次数、间隔人数及起始位置 cin >> m >> n >> s; vector<string> participants(m); for(int i = 0; i < m; ++i){ cin >> participants[i]; } bool hasWinner = false; // 标记是否有获奖者 for(int i = s - 1; i < m; i += n){ // 调整索引以便正确映射到参与者数组 if(i >= 0 && i < m){ cout << participants[i] << endl; hasWinner = true; } } if(!hasWinner){ cout << "Keep going..."; } return 0; } ``` 上述程序实现了基本的功能需求,其中包含了几个重要部分: - 使用`vector<string>`来保存所有的参与人员名单[^1]。 - 设置布尔型标志位`hasWinner`用来跟踪是否存在任何合法的赢家。 - 对整个循环过程进行了优化以防止越界访问错误。 #### 注意事项 当实际编写此类竞赛类算法时需要注意边界情况和其他潜在陷阱,比如初始偏移量`s`的有效范围验证等问题都需要额外考虑进去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值