本题先尝试了用单独用数组与单独用链表的方式,但都由于时间复杂度过大而运行超时。故尝试使用以数组、映射模拟链表,用一个字符串数组记录从数字到字符串的映射,用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;
}



京公网安备 11010502036488号