zoukankan      html  css  js  c++  java
  • 51Nod1590

    题意

    中文题。

    简单来说就是:把y串的开头串,放到x串最后一个元素的后面

    注意是串,不是单个数字

    注意

    虽然样例给的是单个数字,但是题意说的是串,是串,是整个串进行移动!

    思路

    一看就是链表合并,可是我的链表就是个渣渣,懂思路不会写,嘿,就是玩,我用数组写的。

    官方题解说的就蛮好:每一次合并操作,本质上是在合并2个链表。相当于把以y为开头的链表,插入到以x为开头的链表的尾部。为了能够快速执行这个操作,我们除了在链表中记录每一个节点的next ,还需要增加一个tail ,来记录尾巴节点的位置。2个链表的合并后,尾巴的信息要更新,x的tail变为y的tail。初始的时候,每个节点的tail是自己。 本题如果使用数组来做,效率会很低,而2个链表可以在常数时间也就是O(1)内合并。

    数组的AC代码在下面
    链表的自行写或查找
    list写的:参考:https://blog.csdn.net/qq_41708792/article/details/101307816
    (因为我觉得list想着简单,实现起来有点麻烦,知道一些list相关方法怎么用就行了。)

    AC代码(数组)

    #include<iostream>
    #include<algorithm>
    #include<map>
    #include<string.h>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<stdio.h>
    using namespace std;
    typedef long long ll;
    #define inf 0x3f3f3f3f
    
    const int N=10010;
    struct node
    {
        int next,tail;
    }a[N];
    bool isnext[N];
    
    int main()
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
            a[i].tail=i;
        for(int i=1;i<n;i++)// 输入n-1行
        {
            int x,y;
            cin>>x>>y;
            // 把y串的开头串
            // 放到x串最后一个元素的后面
            a[a[x].tail].next=y;
            a[x].tail=a[y].tail;
            isnext[y]=1;
        }
        int head=0;
        for(int i=1;i<=n;i++)
        {
            if(!isnext[i])
                head=i;
        }
        for(int i=head;i!=0;i=a[i].next)
            cout<<i<<endl;
        return 0;
    }
    
  • 相关阅读:
    ssh免密钥登陆的两种方式
    python 项目实战之装饰器
    python 项目实战之随机杀死程序
    python paramiko外部传参和内部调用命令的方法
    linux screen 工具
    shell删除三天前或者三天内的文件
    CentOS7.3安装Go运行和开发环境
    4.Linq to Xml
    30.第一个Linq 数据库查询
    html 图标库
  • 原文地址:https://www.cnblogs.com/OFSHK/p/14737119.html
Copyright © 2011-2022 走看看