本题先尝试了用单独用数组与单独用链表的方式,但都由于时间复杂度过大而运行超时。故尝试使用以数组、映射模拟链表,用一个字符串数组记录从数字到字符串的映射,用map记录从字符串到数字的映射,再用两个整型数组prev[]与next[]记录当前数字索引的前驱与后继索引。在后续赋值改变前驱后继时,要注意避免需要用到的原数值被新值覆盖!

#include <iostream>
#include <map>
#include <vector>
using namespace std;
int main(){
    int n,m;
    string s,a;
    cin>>n>>m;
    vector<string> v(n+1);
    vector<int> next(n+2);
    vector<int> prev(n+2);
    map<string,int> ma;
    for(int i=1;i<=n;i++){
        cin>>s;
        v[i]=s;
        ma[s]=i;
    }
    for(int i=1;i<=n;i++){
        next[i]=i+1;
        prev[i]=i-1;
    }
    prev[n+1]=n;
    next[0]=1;
    for(int i=0;i<m;i++){
        cin>>s>>a;
        next[prev[ma[s]]]=next[ma[s]];
        prev[next[ma[s]]]=prev[ma[s]];
        next[prev[ma[a]]]=ma[s];
        next[ma[s]]=ma[a];
        prev[ma[s]]=prev[ma[a]];       //这一行一定要写在下一行之前,因为下一行重新对pre[ma[a]]进行了赋值
        prev[ma[a]]=ma[s];
    }
    int i=0;
    while(next[i]!=n+1){
        cout<<v[next[i]]<<' ';
        i=next[i];
    }
    return 0;
}