UVA12174_Shuffle
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的更多相关文章
随机推荐
- Codeforces - 1088B - Ehab and subtraction - 堆
https://codeforc.es/contest/1088/problem/B 模拟即可. #include<bits/stdc++.h> using namespace std; ...
- 20180308-Python内置方法
先大致粗略的说一下反射的概念,不是很准确,后续详细讲解: 1. 以字符串的形式,导入模块 2. 以字符串的形式,获取模块内部的函数,并执行 通常我们想在一个模块中导入另外一个模块,则需要通过 impo ...
- Dubbo源码学习总结系列二 dubbo-rpc远程调用模块
dubbo本质是一个RPC框架,我们首先讨论这个骨干中的骨干,dubbo-rpc模块. 主要讨论一下几部分内容: 一.此模块在dubbo整体框架中的作用: 二.此模块需要完成的需求功能点及接口定义: ...
- Java 集合遍历
在集合中使用Lambda表达式 Map集合中 forEach and Map 常规遍历-> 两种遍历: Map map = new HashMap(); map.put(102, "张 ...
- 【读书笔记】Cracking the Code Interview(第五版中文版)
导语 所有的编程练习都在牛客网OJ提交,链接: https://www.nowcoder.com/ta/cracking-the-coding-interview 第八章 面试考题 8.1 数组与字符 ...
- 【LeetCode】贪心 greedy(共38题)
[44]Wildcard Matching [45]Jump Game II (2018年11月28日,算法群衍生题) 题目背景和 55 一样的,问我能到达最后一个index的话,最少走几步. 题解: ...
- Sass-颜色运算
所有算数运算都支持颜色值,并且是分段运算的.也就是说,红.绿和蓝各颜色分段单独进行运算.如: p { color: #010203 + #040506; } 计算公式为 01 + 04 = 05.02 ...
- gps位置坐标转百度坐标
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- center os 下redis安装以及基本使用
解压并进入其目录 make cd src make install 默认情况,Redis不是在后台运行,我们需要把redis放在后台运行 vim /usr/local/redis/etc/redis. ...
- axios之前端发送get与post请求模板
import axios from "axios"; 一.get mounted() { axios .get( "/api/queryusertree?domId=&q ...