[BZOJ4382][POI2015]Podział naszyjnika (神奇HASH)
【问题描述】
长度为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)的更多相关文章
- BZOJ4382 : [POI2015]Podział naszyjnika
对于每种颜色,可以发现可以切的位置被分割成了若干段独立的区域. 给每个区域一个编号,将$m$种颜色的情况当成字符串来看,如果两个切口的字符串完全匹配,那么可以在这里切两刀. 可以构造hash函数,通过 ...
- 【BZOJ4382】[POI2015]Podział naszyjnika 堆+并查集+树状数组
[BZOJ4382][POI2015]Podział naszyjnika Description 长度为n的一串项链,每颗珠子是k种颜色之一. 第i颗与第i-1,i+1颗珠子相邻,第n颗与第1颗也相 ...
- @bzoj - 4382@ [POI2015] Podział naszyjnika
目录 @description@ @solution@ @accepted code@ @details@ @description@ 长度为 n 的一串项链,每颗珠子是 k 种颜色之一. 第 i 颗 ...
- POI2015题解
POI2015题解 吐槽一下为什么POI2015开始就成了破烂波兰文题目名了啊... 咕了一道3748没写打表题没什么意思,还剩\(BZOJ\)上的\(14\)道题. [BZOJ3746][POI20 ...
- [Poi2015]
[POI2015]Łasuchy 一看以为是sb题 简单来说就是每个人获得热量要尽量多 不能找别人 首先这道题好像我自己找不到NIE的情况 很容易想到一个优化 如果一个数/2>另一个数 那么一定 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- Codeforces.700E.Cool Slogans(后缀自动机 线段树合并 DP)
题目链接 \(Description\) 给定一个字符串\(s[1]\).一个字符串序列\(s[\ ]\)满足\(s[i]\)至少在\(s[i-1]\)中出现过两次(\(i\geq 2\)).求最大的 ...
- Luogu3587[POI2015]POD - hash + 单调队列
Solution 还是去看了题解. 感谢大佬的博客→ 题解传送门 是一道思路比较新的题. 搞一个前缀和, 记录前 $i$ 个位置每种颜色的出现次数, 如果位置 $i$ 是 颜色 $a[i]$ 的最后 ...
- BZOJ 3790 神奇项链 hash/后缀自动机+贪心
Description 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小写字母组成的字符串,每个小写字母表示一种颜色. 为了制作这个项链,小 H 购买了两个机器.第一个机器可 ...
随机推荐
- 如何在你的springboot(cloud)项目中引入我的github上的jar仓库呢?
1. 将此标签内容放到pom.xml仅次于project标签下 <repositories> <repository> <id>github</id> ...
- Mac Sublime Text使用python3运行脚本(command+b)
默认安装好sublime, 使用快捷键command+b的时候, 会使用python2版本运行 下面就改为用python3运行, 也可以python2运行 一. 新建文件 Sublime Text - ...
- A1139 | 玩成模拟题的DFS
考试的时候有思路了,但是没写完.这题起码要40min写,思路太诡异了. 刚刚写了一段,只过了一个case,得了18分,还行.明日再战. #include <stdio.h> #includ ...
- cf1173 D. Nauuo and Circle
链接 [cf]http://codeforces.com/contest/1175/problem/F) 思路 当1在1的位置做dp[i]为i的子树所有的方案. 一条性质是i的子树所占圆上的位置一定一 ...
- vue-skeleton-webpack-plugin骨架屏与page-skeleton-webpack-plugin骨架屏生成插件
vue-skeleton-webpack-plugin与page-skeleton-webpack-plugin使用 插件github地址:https://github.com/lavas-proje ...
- 【Gamma】Scrum Meeting 5
目录 写在前面 进度情况 任务进度表 照片 写在前面 例会时间:6.1 22:45-23:00 例会地点:微信群语音通话 代码进度记录github在这里 临近期末,团队成员课程压力均较大,需要较多时间 ...
- 深度学习最全优化方法总结比较及在tensorflow实现
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/u010899985/article/d ...
- MLflow系列1:MLflow入门教程(Python)
英文链接:https://mlflow.org/docs/latest/tutorial.html 本文链接:https://www.cnblogs.com/CheeseZH/p/11943280.h ...
- android studio如何连接夜神模拟器
原创 2018-02-05 21:35:03 会飞的鱼儿android 阅读数 16706 文章标签: 夜神模拟器连接夜神模拟器的简单方式 更多 分类专栏: Android 版权声明:本文为博主原 ...
- Failure [DELETE_FAILED_INTERNAL_ERROR]之后rm apk卸载
版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/heng615975867/arti ...