题目大意就是 给出长度为n个字符串,然后Q个询问,问长度为k的所有子串中每个子串还有不同的数字的和是多少。
递推
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1000000+10;
int c[MAXN],a[MAXN],d[MAXN],last[MAXN],tot[MAXN];
long long f[MAXN],sum;
int n,Q,ask;
int main()
{
while (cin>>n && n!=0)
{
memset(d,0,sizeof(d));
memset(last,0,sizeof(last));
for (int i = 1;i <=n; ++i)
{
scanf("%d",&a[i]);
d[i-last[a[i]]]++;
last[a[i]]=i;
}
memset(c,0,sizeof(c));
memset(tot,0,sizeof(tot));
for (int i = n ; i>0; i--)
{
tot[i]=tot[i+1]+(1-c[a[i]]);
c[a[i]]=1;
}
f[1]=n;
sum = n;
for (int i = 2;i <= n;++i)
{
f[i]=f[i-1]-tot[n-i+2];
sum-=d[i-1];
f[i]+=sum;
}
cin>>Q;
for (int i = 1;i <= Q;++i)
{
scanf("%d",&ask);
cout<< f[ask] << endl;
}
}
return 0 ;
}