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