【中山市选2011】压缩后缀数组 (Standard IO)

2306. 【中山市选2011】压缩后缀数组 (Standard IO)

Time Limits: 1000 ms  Memory Limits: 128000 KB  Detailed Limits  

Description




Input

Output

Sample Input

32
2 2 14 15 18 23 7 8 28 10 30 31 13 14 15 16 17 18 7 8 21 10 23 13 16 17 27 28 21 30 31 27
8 14 5 2 12 16 7 15 6 9 3 10 13 4 1 11

Sample Output

15 16 31 13 17 19 28 10 7 4 1 21 24 32 14 30 12 18 27 9 6 3 20 23 29 11 26 8 5 2 22 25

Data Constraint

Hint

【数据规模】
  对于20%的数据,有2<=n<=2^6。
  对于100%的数据,有2<=n<=2^14。

Source / Author: sa

题解:(Ψ 是希腊字母中第二十三个,念psi)

若psi[i] = i 则s[k+1][i]一定是偶数,是偶数就不会被删除,会在s[k]出现。

若psi[i]!=i 则s[k+1][i]为odd number ,那么它+1就是偶数,上一步已处理过,又给你了位置,要求这个奇数就容易了。

#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
#define N 20010
#define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
#define INF 2147483647
using namespace std;


int n,i,j,t,cnt;
int psi[N],a[N],ans[N];

int main()
{
	scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%d",&psi[i]);
	for(i=1;i<=n/2;i++)scanf("%d",&a[i]);
	for(i=1;i<=n;i++)if(psi[i]==i) ans[i] = a[++cnt]*2;
	for(i=1;i<=n;i++)if(psi[i]!=i)
	{
		ans[i] = ans[psi[i]]-1;
	}
	for(i=1;i<=n;i++)printf("%d ",ans[i]);
	return 0;
}

O(n)

猜你喜欢

转载自blog.csdn.net/Com_man_der/article/details/89420380