题意:
给出两串序列a和b,每次操作可以选择其中一串序列,把它的前k个元素和最后k个元素交换,k<=n/2,询问是否有可能使得两个序列相等。
题解:
思考之后可以想到,数组中原来下标和为n+1的二元组,无论怎么交换,下标和永远是n+1。根据这个性质,可以提取出这些二元组,看看能不能完全匹配。
#include<bits/stdc++.h> using namespace std; const int maxn=505; int t,n; int a[maxn]; int b[maxn]; int visit[maxn];//标记二元组是否被使用 int main () { scanf("%d",&t); while (t--) { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]); for (int i=1;i<=n;i++) scanf("%d",&b[i]),visit[i]=0; int f=1; for (int i=1;i<=n/2;i++) { int x=a[i]; int y=a[n-i+1]; f=0; for (int j=1;j<=n/2;j++) { if (visit[j]) continue; if ((b[j]==x&&b[n+1-j]==y)||(b[j]==y&&b[n+1-j]==x)) { visit[j]=1; f=1; break; } } if (!f) break; } if (n%2==1&&a[n/2+1]!=b[n/2+1]) f=0; if (f) printf("yes "); else printf("no "); } }