#include<cstdio>
#include<cstring>
const int maxn=1000005;
typedef __int64 lld;
lld dp[maxn];
int dis[maxn];
int mp[maxn];
int a[maxn];
int h[maxn];
int flag[maxn];
/*
初始状态很好看DP[1]=N;
DP[I]表示长度为i的可能
把没一个dp状态的情况列出来,看如何在转移
*/
int n;
int main(){
int i,j;
int x,y;
while(scanf("%d",&n)!=EOF && n){
memset(mp,0,sizeof(mp));
memset(dis,0,sizeof(dis));
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
dis[i-mp[a[i]]+1]++;
mp[a[i]]=i;
}
dp[1]=n;
h[1]=1;
memset(flag,0,sizeof(flag));
flag[a[n]]=1;
for(i=n-1;i>=1;i--){
if(!flag[a[i]])h[n-i+1]=h[n-i]+1;
else h[n-i+1]=h[n-i];
flag[a[i]]=1;
}
for(i=2,j=n;i<=n;i++){
j-=dis[i];
dp[i]=dp[i-1]-h[i-1]+(j);
}
int Q;
scanf("%d",&Q);
for(i=1;i<=Q;i++){
scanf("%d",&x);
printf("%I64d\n",dp[x]);
}
}
return 0;
}
HDU Substrings
最新推荐文章于 2020-03-25 18:03:17 发布