hdu 4455 Substrings (DP 预处理思路)「建议收藏」

hdu 4455 Substrings (DP 预处理思路)

大家好,又见面了,我是全栈君。

Substrings

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1727    Accepted Submission(s): 518




Problem Description
XXX has an array of length n. XXX wants to know that, for a given w, what is the sum of the distinct elements’ number in all substrings of length w. For example, the array is { 1 1 2 3 4 4 5 } When w = 3, there are five substrings of length 3. They are (1,1,2),(1,2,3),(2,3,4),(3,4,4),(4,4,5)

The distinct elements’ number of those five substrings are 2,3,3,2,2.

So the sum of the distinct elements’ number should be 2+3+3+2+2 = 12
 


Input
There are several test cases.

Each test case starts with a positive integer n, the array length. The next line consists of n integers a
1,a
2…a
n, representing the elements of the array.

Then there is a line with an integer Q, the number of queries. At last Q lines follow, each contains one integer w, the substring length of query. The input data ends with n = 0 For all cases, 0<w<=n<=10
6, 0<=Q<=10
4, 0<= a
1,a
2…a
n <=10
6
 


Output
For each test case, your program should output exactly Q lines, the sum of the distinct number in all substrings of length w for each query.
 


Sample Input
   
   
7 1 1 2 3 4 4 5 3 1 2 3 0

 


Sample Output
   
   
7 10 12

 

1、 非常明显,长度为1的答案为dp[1]=n;

2、 长度为2的为dp[2]=dp[1]+x-y=7+4-1=10;

X为添加的一个数和前边不同的个数,{1,1},{1,2},{2,3},{3,4},{4,4},{4,5} 为4;

Y为去掉的不足2的区间有几个不同数字,长度为1的最后一个区间{5},须要舍去。为1;

3、

长度为3的为dp[3]=dp[2]+x-y=10+4-2=12。

X为添加的一个数和前边不同的个数,{1,1,2}。{1,2,3},{2,3,4}。{3,4,4},{4,4,5}为4;

Y为去掉的不足3的区间有几个不同数字。长度为2的最后一个区间{4,5},须要舍去,为2;

所以,我们须要得到当前数字和它上次出现的位置差的大小。详细实现看代码。。

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define N 1000005
#define LL __int64
const int inf=0x1f1f1f1f;
int a[N],len[N],pre[N],vis[N],f[N];
LL dp[N];
int main()
{
    int i,n,m;
    while(scanf("%d",&n),n)
    {
        memset(pre,-1,sizeof(pre)); //记录一个值上次出现的位置
        memset(len,0,sizeof(len)); //len[i]:有几个间隔为i的数
        memset(dp,0,sizeof(dp));   //记录终于答案
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            len[i-pre[a[i]]]++;
            pre[a[i]]=i;
        }
        for(i=n-1;i>=0;i--)
            len[i]+=len[i+1];
        memset(f,0,sizeof(f));   //f[i]从后往前记录后i个数有几个不同值
        memset(vis,0,sizeof(vis));
        for(i=1;i<n;i++)
        {
            f[i]=f[i-1];
            if(!vis[a[n-i]])
            {
                vis[a[n-i]]=1;
                f[i]++;
            }
        }
        dp[1]=n;
        for(i=2;i<=n;i++)
            dp[i]=dp[i-1]+len[i]-f[i-1];
        scanf("%d",&m);
        while(m--)
        {
            scanf("%d",&i);
            printf("%I64d\n",dp[i]);
        }

    }
    return 0;
}


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116273.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • vs安装本地nuget包(vs2015离线使用)

    今天想在项目中使用RestSharp,不过在nuget控制台中发现要么新版本不支持.net4.0,要么用老版本的下载不下来,最后没办法,在RestSharp网站上下载了离线安装包,怎样安装呢?方法之一,概括而言就是把安装包放在NuGet下载缓存目录下,下面就来打开目录:1.Tool-NuGetPackageManager-PackageManagerSettings2…

  • windows内核编程_linux内核编程

    windows内核编程_linux内核编程什么是Windows内核编程

  • c++枚举类型enum输出_python中的枚举

    c++枚举类型enum输出_python中的枚举enum枚举的含义?enum枚举的声明?enum枚举的特点?enum枚举的作用?enum枚举的注意事项?

  • 将String转换成Int数组-Java「建议收藏」

    今天贴出来一个编程小技巧,利用substring或charAt将字符转换为int数组。方法一:publicclassParseString{publicstaticint[]stringToInts(Strings){int[]n=newint[s.length()];for(inti=0;i

  • go 截取字符串_c语言输入n个字符串

    go 截取字符串_c语言输入n个字符串Go语言没有像Java一样的substring()方法,但是可以通过如下方式实现字符串截取funcTest_GoSubString(t*testing.T){ str:=”sssssddddd” rs:=[]rune(str) //rs[开始索引:结束索引] fmt.Println(string(rs[3:6])) str=”你好,Go语言” rs=[]ru…

  • 大学数学课程(本科数学系有哪些课程)

    专业基础类课程:解析几何(大一上学期)数学分析I(大一上学期)数学分析II(大一下学期)数学分析III(大二上学期)高等代数I(大一上学期)高等代数II(大一下学期)常微分方程(大二上学期)抽象代数(大二下学期)概率论基础(大二下学期)复变函数(大二下学期)近世代数(大二下学期)专业核心课程:实变函数(大三上学期)偏微分方程(大三上学期)概率论(大三上学期)拓扑学(大三下学期)泛函分析(大三下学期)微分几何(大三下学期)数理方程(大三下学期)专业选

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号