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;
    }
    
  • 相关阅读:
    cpu 怎么区分指令与数据,寄存器与内存各自对应什么
    添加省略号
    有关自有属性,原型属性的问题
    实现一个new
    滚动条样式修改
    备忘录实现+具体需求应用备忘录
    Math.random生成指定范围的随机数
    reduce详细用法
    一个搜索上下的功能,用的不多
    svg拖拽rect,line,circle
  • 原文地址:https://www.cnblogs.com/OFSHK/p/14737119.html
Copyright © 2011-2022 走看看