【问题描述】
    长度为n 的一串项链,每颗珠子是K 种颜色之一。第i 颗与第i-1,i+1 颗珠子相邻,第n 颗与第1 颗也相邻。
    切两刀,把项链断成两条链。要求每种颜色的珠子只能出现在其中一条链中。
    求方案数量。
【输入】
    输入文件名为(neck.in)。
    第一行两个数n,K。
    第二行n 个数,第i 个数代表第i 颗珠子的颜色。
【输出】
    输出文件名为(neck.out)。
    一行一个数表示答案。
样例输入

neck.in
    4 3
    1 2 3 3

样例输出

neck.out
    3
 【数据范围与约定】
    对于20%的数据:n,K<= 10
    对于40%的数据:n,K<=1000
    对于100%的数据:n,K<= 1000000


题解:

称一个位置的后继为这个位置之后第一个与其颜色相同的位置。(i-1,i)表示i和i-1之间的间隔。

如果一个位置有后继,那么将这个位置的权值加上一个较大的随机整数,后继的权值减去这个整数。(此处用HASH实现)

设权值的前缀和为sum。

设i,j为两个位置,那么如果sum[i]=sum[j],就认为(i-1,i),(j-1,j)可以成为一对切割位置。

因为如果一个数和它的后继被分到不同两段,就会对一个sum产生贡献。

复杂度O(nlogn)

代码如下:

#include<bits/stdc++.h>
#define U unsigned
#define N 1100000
#define seed 19260817
using namespace std;
U long long pw[N],val[N],sum[N];
long long ans;
int n,K,tot,top,last[N],a[N],st[N],nex[N],vis[N];
int main(){
freopen("neck.in","r",stdin);
freopen("neck.out","w",stdout);
scanf("%d%d",&n,&K);
pw[]=;
for(int i=;i<=n;i++) pw[i]=pw[i-]*seed;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
if(last[a[i]]){
val[last[a[i]]]+=pw[++tot];
val[i]-=pw[tot];
}
last[a[i]]=i;
}
for(int i=;i<=n;i++) sum[i]=sum[i-]+val[i];
sort(sum+,sum+n+);
int now=;
for(int i=;i<=n;i++){
now++;
if(i==n||sum[i]!=sum[i+])
ans+=(long long)now*(now-)/,now=;
}
printf("%d",ans);
return ;
}
#include<bits/stdc++.h>
#define U unsigned
#define N 1100000
#define seed 19260817
using namespace std;
U long long pw[N],val[N],sum[N];
long long ans;
int n,K,tot,top,last[N],a[N],st[N],nex[N],vis[N];
int main(){
freopen("neck.in","r",stdin);
freopen("neck.out","w",stdout);
scanf("%d%d",&n,&K);
pw[]=;
for(int i=;i<=n;i++) pw[i]=pw[i-]*seed;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
if(last[a[i]]){
val[last[a[i]]]+=pw[++tot];
val[i]-=pw[tot];
}
last[a[i]]=i;
}
for(int i=;i<=n;i++) sum[i]=sum[i-]+val[i];
sort(sum+,sum+n+);
int now=;
for(int i=;i<=n;i++){
now++;
if(i==n||sum[i]!=sum[i+])
ans+=(long long)now*(now-)/,now=;
}
printf("%d",ans);
return ;
}

[BZOJ4382][POI2015]Podział naszyjnika (神奇HASH)的更多相关文章

  1. BZOJ4382 : [POI2015]Podział naszyjnika

    对于每种颜色,可以发现可以切的位置被分割成了若干段独立的区域. 给每个区域一个编号,将$m$种颜色的情况当成字符串来看,如果两个切口的字符串完全匹配,那么可以在这里切两刀. 可以构造hash函数,通过 ...

  2. 【BZOJ4382】[POI2015]Podział naszyjnika 堆+并查集+树状数组

    [BZOJ4382][POI2015]Podział naszyjnika Description 长度为n的一串项链,每颗珠子是k种颜色之一. 第i颗与第i-1,i+1颗珠子相邻,第n颗与第1颗也相 ...

  3. @bzoj - 4382@ [POI2015] Podział naszyjnika

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 长度为 n 的一串项链,每颗珠子是 k 种颜色之一. 第 i 颗 ...

  4. POI2015题解

    POI2015题解 吐槽一下为什么POI2015开始就成了破烂波兰文题目名了啊... 咕了一道3748没写打表题没什么意思,还剩\(BZOJ\)上的\(14\)道题. [BZOJ3746][POI20 ...

  5. [Poi2015]

    [POI2015]Łasuchy 一看以为是sb题 简单来说就是每个人获得热量要尽量多 不能找别人 首先这道题好像我自己找不到NIE的情况 很容易想到一个优化 如果一个数/2>另一个数 那么一定 ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. Codeforces.700E.Cool Slogans(后缀自动机 线段树合并 DP)

    题目链接 \(Description\) 给定一个字符串\(s[1]\).一个字符串序列\(s[\ ]\)满足\(s[i]\)至少在\(s[i-1]\)中出现过两次(\(i\geq 2\)).求最大的 ...

  8. Luogu3587[POI2015]POD - hash + 单调队列

    Solution 还是去看了题解. 感谢大佬的博客→  题解传送门 是一道思路比较新的题. 搞一个前缀和, 记录前 $i$ 个位置每种颜色的出现次数, 如果位置 $i$ 是 颜色 $a[i]$ 的最后 ...

  9. BZOJ 3790 神奇项链 hash/后缀自动机+贪心

    Description 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小写字母组成的字符串,每个小写字母表示一种颜色. 为了制作这个项链,小 H 购买了两个机器.第一个机器可 ...

随机推荐

  1. expr算术运算

    #!/bin/bash #expr MY_VAR1= MY_VAR2= #expr 是命令 MY_VAR3=`expr $MY_VAR1 + $MY_VAR2` MY_VAR4=`expr $MY_V ...

  2. 第03组 Alpha冲刺

    队名:不等式方程组 组长博客 作业博客 团队项目进度 组员一:张逸杰(组长) 过去两天完成的任务: 文字/口头描述: 制定了初步的项目计划,并开始学习一些推荐.搜索类算法 GitHub签入纪录: 暂无 ...

  3. AntDesign-React与VUE有点不一样,第一篇深入了解React的概念之一:JSX

    AntDesign-React与VUE有点不一样,第一篇深入了解React的概念之一:JSX 一.什么是JSX 使用JSX声明一个变量(REACT当中的元素): const element =< ...

  4. Fluent——UDF监测指定点的物理量

    Fluent版本:19.0 Fluent当中提供了监测某一点物理量随迭代次数或者随时间变化的功能,下面我们就介绍如何在UDF当中实现相同的功能,并且UDF更加灵活,通过UDF的方式我们在知道某点运动规 ...

  5. 从编程哲学到开发应用:Spring的初步应用

    一.前言 在学习Spring的过程中,我们学习了很多东西,可是实际应用中,我们究竟用到了那些?常用的又是那种方法呢? 二.书上与开发的差异 1.IOC 1) IOC,控制反转,是Spring框架的核心 ...

  6. 刷题记录:[强网杯 2019]Upload

    目录 刷题记录:[强网杯 2019]Upload 一.知识点 1.源码泄露 2.php反序列化 刷题记录:[强网杯 2019]Upload 题目复现链接:https://buuoj.cn/challe ...

  7. ImportError: DLL load failed while importing win32api: 找不到指定的模块。

    这个是用pip install pywin32安装报的一个错误 据说直接使用pip install pypiwin32安装就不会有报错 但是遇到错误还是要尝试解决一下的 pip install pyw ...

  8. The Five Qualities You Need in a Partner

    The Five Qualities You Need in a Partner Things I Never Considered Before Getting Married (But Shoul ...

  9. mysql8.0:SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

    忽然注意到的情况: 2018/7/19至2018/9/13之间发布的7.1.20.7.1.21.7.1.22和7.2.8.7.2.9.7.2.10这六个版本提供的对caching_sha2_passw ...

  10. 010 vue使用render方法渲染组件

    1.普通的组件渲染方式 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...