码迷,mamicode.com
首页 > 其他好文 > 详细

hdu4455Substrings dp

时间:2015-04-07 21:38:45      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

// dp[i+1] = dp[i] + dis[i] - c[i] ;
// dp[i] 表示子串长度为i的不同数的和
//dis[i] 表示所有数在其前面和其相同的点的最短距离大于等于i的和
//c[i] 表示最后一个长度为i的子序列的不同数的和
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std ;
const int maxn  = 1000010 ;
__int64 dp[maxn] ;
int a[maxn] ;
int dis[maxn] ;
int last[maxn] ;
int Hash[maxn] ;
int main()
{
  //  freopen("in.txt","r",stdin) ;
    int N ;int Q ;
    while(scanf("%d",&N) && N)
    {
        memset(Hash , 0 , sizeof(Hash));
        memset(dis , 0 , sizeof(dis)) ;
        for(int i = 1;i <= N;i++)
        {
            scanf("%d" , &a[i]);
            if(Hash[a[i]])
            dis[i - Hash[a[i]]]++;
            else
            dis[i] ++ ;                //对于前面没有相同的数,假定和它相同的点的数为0
            Hash[a[i]] = i;
        }
        memset(Hash , 0 ,sizeof(Hash));
        for(int i  = N; i > 0; i--)
        {
            dis[i] += dis[i+1] ;
            last[i] = last[i+1] ;
            if(!Hash[a[i]])
            last[i]++ ;
            Hash[a[i]] = 1;
        }
        dp[1] = N;
        for(int i = 2; i <= N;i++)
        dp[i] = dp[i-1] + (__int64)dis[i] - (__int64)last[N - i +2] ;
        scanf("%d" ,&Q) ;
        while(Q--)
        {
           int query ;
           scanf("%d" ,&query);
           printf("%I64d\n",dp[query]) ;
        }
    }
    return 0;
}





















































hdu4455Substrings dp

标签:

原文地址:http://blog.csdn.net/cq_pf/article/details/44925825

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!