Shuffle

大致题意:

你有一个随机播放的播放器,有s首歌,在这s首播放完之前不会重新打乱顺序,现在给出一段只含有1~s的n长度序列,现在问你下次随机排序发生的时间有多少种可能

其实就是问你这个播放记录的起点有多少种可能

思路:

先暴力枚举一下开头s个字符分别为起点,然后验证这样是否合法

这样关注的焦点就是如何检验了,暴力显然不行,那么我们就预处理所有可以是一段记录播放起点的点(也就是含这个点后s个字符各不相同),那么检验最开始s个分别是否为合法起点的时候就只要不断枚举他后面第s为起点是否合法就行了,

现在问题又转移到如何知道s个连续序列是否都不相同了,这个就和滑动窗口很像了,

我们只要记录s个字符每个字符的的出现次数和有多少个不同字符串就行了,如果有s个不同字符串就能为起点,每次转移时间区间整体右移一个单位,那么变化的是原来区间的最左端和最右端+1的个数,如果有计数变成1则出现新字符,如果变成0则失去了一个字符



这个程序有一个小技巧,就是在n字符前面添加s个作为形式起点

但这样写出现bug了,原因是我默认n>=s了,而且最后s个字符和最初s个字符不能使用是否有s个不同的字符来检验合法性了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<cstdlib>
#include<algorithm>
#include<stack>
#include<map>
#include<queue>
#include<vector> using namespace std;
const int maxn = 3e5+100;
#define pr(x) cout << #x << " = " << x << " ";
#define prln(x) cout << #x << " = " << x <<endl;
#define ll long long
int x[maxn], ok[maxn], cnt[maxn], s, n;
int main(){
#ifdef LOCAL
freopen("C:\\Users\\User Soft\\Desktop\\in.txt","r",stdin);
//freopen("C:\\Users\\User Soft\\Desktop\\out.txt","w",stdout);
#endif
int t;cin >> t;
while(t--) {
cin >> s >> n;
memset(x, -1, sizeof x);
memset(cnt, 0, sizeof cnt);
memset(ok, 0, sizeof ok);
for(int i = 0; i < n; ++i) {
scanf("%d", x + s + i);
}
int tot = 0;
for(int i = 0; i < n + s; ++i) {
if(tot == s) ok[i] = true;
if(i < s && tot == i) ok[i] = true;
if(i > n && n + s - i == tot) ok[i] = true; if(x[i] != -1 && --cnt[x[i]] == 0) --tot;
if(x[i + s] != -1 && cnt[x[i + s]]++ == 0) ++tot;
}
int ans = 0;
for(int i = 0; i < s; ++i) {
int flag = 1;
for(int j = i; j < n + s; j+= s) {
if(!ok[j]) {
flag = 0;
break;
}
}
ans += flag;
}
if(ans == n + 1) ans = s;
cout << ans << endl;
}
return 0;
}





UVA12174_Shuffle的更多相关文章

随机推荐

  1. 03 synchronized

    synchronized 1. 锁机制的特性 互斥性:在同一时间只允许一个线程持有某个对象锁(原子性) 可见性:必须确保在锁被释放之前,对共享变量所在的修改,对于随后获得该锁的另一个线程是可见的 2. ...

  2. 使用jdbc查询防止出现中文乱码的方法

    在使用mysql创建数据库及表格,在navicat中可以正常查询出中文,但使用jdbc查询的结果中,中文为乱码. 网上查到资料,为了能够彻底一劳永逸的解决这个问题,需要修改mysql下配置文件my.i ...

  3. NGUI的下拉框的使用(popup list script)

    一,我们先添加一个sprite,选择sprite,右键选择attach,添加box collider, 然后右键选择attach,添加popup list script ,我们给popup list ...

  4. CSS flex 布局学习笔记

    写在前面 Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为 Flex 布局. 采用 Flex 布局的元素 ...

  5. 微软Visual Studio Code基本特征

    Visual Studio Code它的核心功能还是作为一个代码编辑器.和其他的代码编辑器一样,VScode采取通用的UI和布局,浏览器在左边,显示所有的文件和文件夹,右边你打开的文件的编辑页面. 文 ...

  6. JavaScript——正则匹配、正则提取、正则替换

    正则匹配 // 匹配日期 var dateStr = '2015-10-10'; var reg = /^\d{4}-\d{1,2}-\d{1,2}$/ console.log(reg.test(da ...

  7. Java-java.lang.NoClassDefFoundError:brave.Span.Kind

    今天在升级某个框架时,遇到如标题描述的问题.这个问题应该说还是比较明显的,首先去搜了一下NoClassDefFoundError的问题,参考这篇博客:https://www.cnblogs.com/x ...

  8. printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf - 输出格式转换

    总览 (SYNOPSIS) #include <stdio.h> int printf(const char *format, ...); int fprintf(FILE *stream ...

  9. 121-基于TI DSP TMS320DM8148的全高清1080P 60fs的视频编解码系统 机器人主板

    基于TI DSP TMS320DM8148的全高清1080P 60fs的视频编解码系统 一.板卡概述 本系统基于最先进的DSP技术,构建一个全高清的视频编解码系统,采用TI的芯片.借助TI的DaVin ...

  10. hdu1257最少拦截系统 贪心

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽 然它的第 ...