D - Rotate Colored Subsequence
思路:一开始我的想法就是暴力,套个双循环,因为长度是2*10^5,O(n2)的复杂度还是有可能冲过去的,结果27/29还是太大了,后面看题解发现可以开一个桶数组来记录每个颜色最后一次出现的位置,当读入一个颜色的时候只需要访问这个桶数组找到这种颜色上次出现的位置并赋值一下就行了,把这个颜色最后一次出现的位置更新为当前位置。
ac:
#include "iostream"
using std::cin;
using std::cout;
using std::endl;
int n, m;
char ch[200005];
char ans[200005];
int c[200005];
int lst[200005];
int tong[200005];
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i = i + 1)
cin >> ch[i];
for (int i = 1; i <= n; i = i + 1)
{
cin >> c[i];
if (tong[c[i]] != 0)
lst[i] = tong[c[i]];
tong[c[i]] = i;
}
for (int i = 1; i <= n; i = i + 1)
{
if (lst[i] == 0)
lst[i] = tong[c[i]];
ans[i] = ch[lst[i]];
}
for (int i = 1; i <= n; i = i + 1)
cout << ans[i];
}