2020 BIT冬训-模拟与暴力 M - Island Puzzle CodeForces - 634A
Problem Description
A remote island chain contains n islands, labeled 1 through n. Bidirectional bridges connect the islands to form a simple cycle — a bridge connects islands 1 and 2, islands 2 and 3, and so on, and additionally a bridge connects islands n and 1. The center of each island contains an identical pedestal, and all but one of the islands has a fragile, uniquely colored statue currently held on the pedestal. The remaining island holds only an empty pedestal.
The islanders want to rearrange the statues in a new order. To do this, they repeat the following process: First, they choose an island directly adjacent to the island containing an empty pedestal. Then, they painstakingly carry the statue on this island across the adjoining bridge and place it on the empty pedestal.
Determine if it is possible for the islanders to arrange the statues in the desired order.
Input
The first line contains a single integer n (2 ≤ n ≤ 200 000) — the total number of islands.
The second line contains n space-separated integers ai (0 ≤ ai ≤ n - 1) — the statue currently placed on the i-th island. If ai = 0, then the island has no statue. It is guaranteed that the ai are distinct.
The third line contains n space-separated integers bi (0 ≤ bi ≤ n - 1) — the desired statues of the ith island. Once again, bi = 0 indicates the island desires no statue. It is guaranteed that the bi are distinct.
Output
Print "YES" (without quotes) if the rearrangement can be done in the existing network, and "NO" otherwise.
Examples
3
1 0 2
2 0 1
YES
2
1 0
0 1
YES
4
1 2 3 0
0 3 2 1
NO
Note
In the first sample, the islanders can first move statue 1 from island 1 to island 2, then move statue 2 from island 3 to island 1, and finally move statue 1 from island 2 to island 3.
In the second sample, the islanders can simply move statue 1 from island 1 to island 2.
In the third sample, no sequence of movements results in the desired position.
即上面的字符串能否通过转换到下面那个(只能相邻移动(1和n之间也可以移动),就像一个环一样)
通过观察。上面的例如1234,只能转化为1234,4123,3412,2341这几种。即不断把最后一位提到最前。
同时我们也可以抛去0的影响。将上面的数列分为两部分。例如2341分为234和1.
即我们找下面的数列的第一个非零数字。找到他在上面数列的位子。那么他后面的数字肯定是下面数列后面的数字。
AC代码如下:
#include<cstdio> #include<algorithm> #include<string> #include<cmath> using namespace std; int n,a[200005],d[200005],temp,d1,flag=1; int main(){ scanf("%d",&n); for(int i=0;i<n-1;i++){ scanf("%d",&a[i]); if(a[i]==0) i--; } for(int i=0;i<n-1;i++){ scanf("%d",&d[i]); if(d[i]==0) i--; } for(int i=0;i<n-1;i++) if(d[0]==a[i]){ temp=i; break; } for(int i=temp+1;i<n-1;i++) if(d[++d1]!=a[i]){ flag =0; break; } if(flag) for(int i=0;i<temp;i++) if(d[++d1]!=a[i]){ flag =0; break; } if(flag) printf("YES"); else printf("NO"); return 0; }

浙公网安备 33010602011771号