1. 题目描述
有长度为$n \in [1, 10^5]$的序列,表示一个打乱的循环排列,即每当$[1 \cdots n]$中的数字全部出现后,再重新产生一个随机的覆盖$[1 \cdots n]$的序列。给定的序列并不是一个完整的循环序列,而是一个子序列。求完整的循环序列共有多少可能?

2. 基本思路
这是《算法竞赛入门经典》的原题,主要思路书里写的很清楚——利用滑动窗口确定每个位置开始是否包含一个循环节。
数据量很大,因此需要对位置进行预处理。同时,对前n个位置进行枚举,判断是否可以作为新的循环节的开始位置。滑动窗口效率很高,可以在$O(n)$时间复杂度进行预处理,算法的整体复杂度也是$O(n \times T)$的。

3. 代码

  1. /* 2774 */
  2. #include <iostream>
  3. #include <sstream>
  4. #include <string>
  5. #include <map>
  6. #include <queue>
  7. #include <set>
  8. #include <stack>
  9. #include <vector>
  10. #include <deque>
  11. #include <bitset>
  12. #include <algorithm>
  13. #include <cstdio>
  14. #include <cmath>
  15. #include <ctime>
  16. #include <cstring>
  17. #include <climits>
  18. #include <cctype>
  19. #include <cassert>
  20. #include <functional>
  21. #include <iterator>
  22. #include <iomanip>
  23. using namespace std;
  24. //#pragma comment(linker,"/STACK:102400000,1024000")
  25.  
  26. #define sti set<int>
  27. #define stpii set<pair<int, int> >
  28. #define mpii map<int,int>
  29. #define vi vector<int>
  30. #define pii pair<int,int>
  31. #define vpii vector<pair<int,int> >
  32. #define rep(i, a, n) for (int i=a;i<n;++i)
  33. #define per(i, a, n) for (int i=n-1;i>=a;--i)
  34. #define clr clear
  35. #define pb push_back
  36. #define mp make_pair
  37. #define fir first
  38. #define sec second
  39. #define all(x) (x).begin(),(x).end()
  40. #define SZ(x) ((int)(x).size())
  41. #define lson l, mid, rt<<1
  42. #define rson mid+1, r, rt<<1|1
  43. #define INF 0x3f3f3f3f
  44. #define mset(a, val) memset(a, (val), sizeof(a))
  45.  
  46. const int maxn = 1e5+;
  47. int a[maxn];
  48. int c[maxn];
  49. bool valid[maxn], visit[maxn];
  50. int n, m;
  51.  
  52. void init() {
  53. int cnt = ;
  54.  
  55. memset(c, , sizeof(c));
  56. // handle [0,n-1]
  57. valid[] = true;
  58. rep(i, , n) {
  59. if (i >= m) { // n >= m
  60. ++cnt;
  61. continue;
  62. }
  63.  
  64. if (c[a[i]] > ) {
  65. valid[] = false;
  66. } else {
  67. ++cnt;
  68. }
  69.  
  70. ++c[a[i]];
  71. }
  72.  
  73. for (int i=,j=n; i<m; ++i,++j) {
  74. if (--c[a[i-]] == )
  75. --cnt;
  76. if (j>=m || c[a[j]]==)
  77. ++cnt;
  78. if (j < m)
  79. ++c[a[j]];
  80.  
  81. valid[i] = cnt==n;
  82. }
  83.  
  84. // handle segment begin with i
  85. memset(c, , sizeof(c));
  86. visit[] = true;
  87.  
  88. rep(i, , n) {
  89. if (i>=m || c[a[i]]==) {
  90. ++c[a[i]];
  91. visit[i+] = true;
  92. } else {
  93. rep(j, i+, n)
  94. visit[j] = false;
  95. break;
  96. }
  97. }
  98. }
  99.  
  100. void solve() {
  101. init();
  102.  
  103. int ans = ;
  104.  
  105. rep(i, , n) {
  106. if (visit[i]) {
  107. int tmp = ;
  108. for (int j=i; j<m; j+=n) {
  109. if (!valid[j]) {
  110. tmp = ;
  111. break;
  112. }
  113. }
  114. ans += tmp;
  115. } else {
  116. break;
  117. }
  118. }
  119.  
  120. printf("%d\n", ans);
  121. }
  122.  
  123. int main() {
  124. ios::sync_with_stdio(false);
  125. #ifndef ONLINE_JUDGE
  126. freopen("data.in", "r", stdin);
  127. freopen("data.out", "w", stdout);
  128. #endif
  129.  
  130. int t;
  131.  
  132. scanf("%d", &t);
  133. while (t--) {
  134. scanf("%d%d",&n,&m);
  135. rep(i, , m)
  136. scanf("%d", &a[i]);
  137. solve();
  138. }
  139.  
  140. #ifndef ONLINE_JUDGE
  141. printf("time = %ldms.\n", clock());
  142. #endif
  143.  
  144. return ;
  145. }

【HDOJ】2774 Shuffle的更多相关文章

  1. 【bzoj1965】: [Ahoi2005]SHUFFLE 洗牌 数论-快速幂-扩展欧几里得

    [bzoj1965]: [Ahoi2005]SHUFFLE 洗牌 观察发现第x张牌 当x<=n/2 x=2x 当x>n/2 x=2x-n-1 好像就是 x=2x mod (n+1)  就好 ...

  2. 【POJ】2774 Long Long Message

    [题意]给定两个字符串S和T,求最长公共子串.len<=10^5. [算法]后缀自动机 [题解]对字符串S建SAM,然后令串T在S上跑匹配. 这是自动机最原本的功能——匹配,就是串T在SAM(S ...

  3. 【HDOJ】4729 An Easy Problem for Elfness

    其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...

  4. 【HDOJ】5632 Rikka with Array

    1. 题目描述$A[i]$表示二级制表示的$i$的数字之和.求$1 \le i < j \le n$并且$A[i]>A[j]$的$(i,j)$的总对数. 2. 基本思路$n \le 10^ ...

  5. 【HDOJ】4373 Mysterious For

    1. 题目描述有两种不同类型的循环,并给出一个由1.2组成的序列,表示嵌套的循环类型.问这样组着的循环一共需要多少次循环?并将结果模364875103. 2.基本思路显然,每当遇到一个类型1的序列,即 ...

  6. 【HDOJ】1667 The Rotation Game

    1. 题目描述有个#字型的条带,可以从横线或竖线进行循环移动,求通过各种移动最终使中心的8个字符全等的长度最短并相同长度字典序最小的操作序列.2. 基本思路24个数据,8种移动方式,数据量很小了,所以 ...

  7. 【HDOJ】4374 One hundred layer

    线性DP,使用单调队列优化. /* 4374 */ #include <iostream> #include <sstream> #include <string> ...

  8. 【HDOJ】4366 Successor

    基本思路是将树形结构转换为线性结构.然后,所求即为一个区间内大于abi的最大的loy指向的ID.将结点按照abi降序排序,注意abi可能相等.然后,使用线段树单点更新,区间查询可解. /* 4366 ...

  9. 【HDOJ】4358 Boring counting

    基本思路是将树形结构转线性结构,因为查询的是从任意结点到叶子结点的路径.从而将每个查询转换成区间,表示从该结点到叶子结点的路径.离线做,按照右边界升序排序.利用树状数组区间修改.树状数组表示有K个数据 ...

随机推荐

  1. myeclipse ctrl+shift+F失效

    因为在使用搜狗输入法,切换到英文状态,输入ctrl+shift+F,格式化完之后,然后再换回来

  2. C++中使用心得

    1.struct成员默认访问方式是public,而 class默认访问方式是private! 2.exit函数终止程序执行会调用析构函数 ,abort函数终止程序不会调用析构函数! 3.静态局部变量直 ...

  3. How do disable paging by swiping with finger in ViewPager but still be able to swipe programmatically?

    The more general extension of ViewPager would bet to create a "SetPagingEnabled" method so ...

  4. emulatorarm.exe已停止工作

    今天使用ADT 打开android模拟器突然发现模拟器报错,[emulatorarm.exe已停止工作],昨天还是好好的,不知道为什么,重建新的模拟器还是这样. 解决办法: 更改ram大小为 512M ...

  5. Flv 视频格式(转)

    最近要用到flv,整理了一些flv格式的资料,供参考. flv文件主要由两部分组成:header和body. 1.header header部分记录了flv的类型.版本等信息,是flv的开头,一般都差 ...

  6. C# - (0x80040154): Retrieving the COM class factory for component with CLSID {877AA945-1CB2-411C-ACD7-C70B1F9E2E32} failed

    1. Exeption Error: System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM clas ...

  7. js--eval函数

    前言: js的eval函数很牛叉,用了几次--不过都没有记录.试想:如果没有EXT.JQery,怎样将json字符串转换为对象呢? 示例: 定义2个字符串变量s1.s2.其中s1表示一个对象:s2表示 ...

  8. Matlab实现求a到b被c整除的个数

    我先想到的是for循环........ 然后sum(find(mod(a:b,c)==0)),从10到100得到874,为什么不对呢? 比如a = [1 2 3 4  2 3 4 2],find(a= ...

  9. Unsupervised Learning: Use Cases

    Unsupervised Learning: Use Cases Contents Visualization K-Means Clustering Transfer Learning K-Neare ...

  10. asp.net 获取客户机IP地址

    /// <summary> ///get client IP /// </summary> /// <returns></returns> public ...