其他分享
首页 > 其他分享> > D. Cyclic Rotation

D. Cyclic Rotation

作者:互联网

D. Cyclic Rotation

题意:

给你两串数

你可以对第一串数多次操作: 选择l r满足a[l] == a[r] 将序列a[l]...a[r] 变成 a[l + 1] ... a[r] a[l] 判断最终a能否变成b (b是a的一个排列)

思路:

可以逆向思考 就相当于在b中有连续的 就可以取出一个放到前面任意一个位置

对于b串 k个连续的那么k-1个都可以由前面换位过来 

可以从后往前遍历b数组一一比对a数组  每次b数组遇到当前数与前面数相同时 储存当前数(用cnt数组记录储存的个数) 比对时如果两者相同 两指针都向前移动一位 当两者不相同时 那就判断 a[i]是否有储存的值 有的话直接对应掉 a数组指针前移 否则就输出no直到b数组都比对完 都符合就输出yes

#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;

const ll inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-4;
const int N = 1e6 + 5;
const int M = 1e5 + 5;
const int mod = 1e9 + 7;
ll n, a[N], b[N], vis[N], cnt[N];
ll pos1[N], pos2[N];
struct node {
    ll num, pos;
}aa[N], bb[N];

bool comp(node a, node b) {
    return a.pos < b.pos;
}

void solve()
{
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        cnt[i] = 0;
    }
    for (int i = 1; i <= n; i++) {
        cin >> b[i];
    }
    for (int i = n, j = n; j >= 1; ) {
        while (b[j] == b[j - 1]) {
            cnt[b[j]]++;
            j--;
            continue;
        }
        if (a[i] == b[j]) {
            i--;
            j--;
        }
        else if (cnt[a[i]]) {
            cnt[a[i]]--;
            i--;
        }
        else {
            cout << "NO\n";
            return;
        }
        
    }
    cout << "YES\n";
}

int main()
{
    IOS;
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
}
 

 

标签:cnt,const,Cyclic,--,ll,int,数组,Rotation
来源: https://www.cnblogs.com/yaqu-qxyq/p/16193217.html