链接:https://www.nowcoder.com/acm/contest/2/C
来源:牛客网

题目描述

shy有一个队列a[1], a[2],…,a[n]。现在我们不停地把头上的元素放到尾巴上。在这过程中我们会得到n个不同的队列,每个队列都是a[k],a[k+1],…,a[n],a[1],…,a[k-1]的形式。在这些队列中,我们可以找到字典序最小的。
shy无聊的时候会给队列的每个元素加一玩。但是为了使得游戏不这么无聊,shy加一以后会给每个元素模m,这样子字典序最小的序列就会变了,生活就变得有趣。
很显然这样子加m次以后,序列会变成原来的样子。所以现在shy想知道,在他没有加一前,加一时,加二时,….,加m-1时字典序最小的序列的第k(和上面的k没有关系)个元素分别是几。

输入描述:

第一行三个整数n,m,k表示序列长度,取模的数和要求的序列的第几个元素。
接下来一行n个整数表示初始序列。

输出描述:

m个整数表示答案。

输入例子:
5 6 3
1 2 1 2 3
输出例子:
1
2
3
5
5
0

-->

示例1

输入

5 6 3
1 2 1 2 3

输出

1
2
3
5
5
0

备注:

对于30%的数据,1≤n,m≤100;
对于100%的数据,1≤n,m≤50000, 1≤k≤n, 0≤a[i]<m;

题解

字符串$hash$。

每个数字都会变且仅变一次零。

如果上一次到这一次没有零产生,那么答案的位置不会改变。

否则重新寻找答案产生的位置。

两个字符串比较字典序,字符串$hash$一下,找$lcp$即可。

#include<bits/stdc++.h>
using namespace std; long long mod[2];
long long base[2];
const int maxn = 1e5 + 10;
int a[maxn], n, m, k;
long long h[2][maxn];
long long b[2][maxn];
int ans[maxn];
vector<int> g[maxn]; void init() {
mod[0] = 1e9 + 7;
mod[1] = 1e9 + 7;
base[0] = 131LL;
base[1] = 313LL;
b[0][0] = b[1][0] = 1LL;
for(int i = 1; i < maxn; i ++) {
for(int t = 0; t < 2; t ++) {
b[t][i] = b[t][i - 1] * base[t] % mod[t];
}
}
} int check(int x, int y, int len) {
if(len == 0) return 1;
if(x > y) swap(x, y);
for(int t = 0; t < 2; t ++) {
long long AA = 0, BB = 0;
if(x > 0) AA = h[t][x - 1] * b[t][len] % mod[t];
if(y > 0) BB = h[t][y - 1] * b[t][len] % mod[t];
long long A = (h[t][x + len - 1] - AA + mod[t]) % mod[t];
long long B = (h[t][y + len - 1] - BB + mod[t]) % mod[t];
if(A != B) return 0;
}
return 1;
} int ok(int x, int y, int f) {
int L = 0, R = n, pos = -1;
while(L <= R) {
int mid = (L + R) / 2;
if(check(x, y, mid)) pos = mid, L = mid + 1;
else R = mid - 1;
}
if(pos == n) return 0;
if((a[x + pos] + f) % m
< (a[y + pos] + f) % m) return 1;
return 0;
} int main() {
init();
scanf("%d%d%d", &n, &m, &k);
k --;
long long A[2];
A[0] = A[1] = 0;
for(int i = 0; i < n; i ++) {
scanf("%d", &a[i]);
a[i + n] = a[i];
g[(m - a[i]) % m].push_back(i);
}
for(int i = 0; i < 2 * n; i ++) {
for(int t = 0; t < 2; t ++) {
A[t] = A[t] * base[t] % mod[t];
A[t] = (A[t] + a[i]) % mod[t];
h[t][i] = A[t];
}
} int p = 0;
for(int i = 1; i < n; i ++) {
if(ok(i, p, 0)) p = i;
}
ans[0] = a[p + k];
for(int i = 1; i < m; i ++) {
if(g[i].size() == 0) {
ans[i] = ans[i - 1] + 1;
} else {
p = g[i][0];
for(int j = 1; j < g[i].size(); j ++) {
if(ok(g[i][j], p, i)) p = g[i][j];
}
ans[i] = (a[p + k] + i) % m;
}
}
for(int i = 0; i < m; i ++) {
printf("%d\n", ans[i]);
}
return 0;
}

牛客练习赛1 C - 圈圈的更多相关文章

  1. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

  2. 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B

    牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...

  3. 牛客练习赛31 D 神器大师泰兹瑞与威穆 STL,模拟 A

    牛客练习赛31 D 神器大师泰兹瑞与威穆 https://ac.nowcoder.com/acm/contest/218/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26214 ...

  4. 最小生成树--牛客练习赛43-C

    牛客练习赛43-C 链接: https://ac.nowcoder.com/acm/contest/548/C 来源:牛客网 题目描述 ​ 立华奏是一个刚刚开始学习 OI 的萌新. 最近,实力强大的 ...

  5. 牛客练习赛28-B(线段树,区间更新)

    牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ ​ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, ​ 1 l r 询问区间[l,r]内的元素和 ​ 2 l r 询问区间[l,r]内的 ...

  6. 牛客练习赛26:D-xor序列(线性基)

    链接:牛客练习赛26:D-xor序列(线性基) 题意:小a有n个数,他提出了一个很有意思的问题:他想知道对于任意的x, y,能否将x与这n个数中的任意多个数异或任意多次后变为y 题解:线性基 #inc ...

  7. [堆+贪心]牛客练习赛40-B

    传送门:牛客练习赛40 题面: 小A手头有 n 份任务,他可以以任意顺序完成这些任务,只有完成当前的任务后,他才能做下一个任务 第 i 个任务需要花费  x_i 的时间,同时完成第 i 个任务的时间不 ...

  8. 牛客练习赛 29 E 位运算?位运算!(线段树)

    题目链接  牛客练习赛29E 对$20$位分别建立线段树.首先$1$和$2$可以合起来搞(左移右移其实是等效的) 用个lazy标记下.转移的时候加个中间变量. $3$和$4$其实就是区间$01$覆盖操 ...

  9. 牛客练习赛22C Bitset

    牛客练习赛22C 一共有 n个数,第 i 个数是 xi  xi 可以取 [li , ri] 中任意的一个值. 设 ,求 S 种类数. 感觉二进制真是一个神奇的东西. #include <iost ...

随机推荐

  1. vscode nodejs智能提示功能

    1.依赖一些第三方的插件,先安装typings这个包,如果使用的是淘宝镜像,输入cnpm.cmd执行: cnpm i typings -g //cnpm install typings -global ...

  2. golang sql.DB

    数据库 sql.DB连接池需知: sql.DB内置连接池,连接不足时会自动创建新连接,新创建的连接使用sql.Open()时传入的dsn来构造. sql.DBClose时只会关闭连接池中的连接,未归还 ...

  3. HDU 1017 A Mathematical Curiosity 数学题

    解题报告:输入两个数,n和m,求两个数a和b满足0<a<b<n,并且(a^2+b^2+m) % (a*b) =0,这样的a和b一共有多少对.注意这里的b<n,并不可以等于n. ...

  4. POJ 3255 Roadblocks (次短路 SPFA )

    题目链接 Description Bessie has moved to a small farm and sometimes enjoys returning to visit one of her ...

  5. Django认证系统实现的web页面

    结合数据库.ajax.js.Djangoform表单和认证系统的web页面 一:数据模块 扩展了Django中的user表,增加了自定义的字段 from django.db import models ...

  6. H5 键盘兼容性小结

    H5 键盘兼容性小结 在 H5 项目中,我们会经常遇到页面中存在单个甚至多个 input/textarea 输入框与底部固定元素的布局情况.在 input/textarea 输入框获取焦点时,会自动触 ...

  7. JS设计模式——6.方法的链式调用

    什么是链式调用 这个很容易理解,例如: $(this).setStyle('color', 'red').show(); 分解链式调用 链式调用其实是两个部分: 1.操作对象(也就是被操作的DOM元素 ...

  8. Java学习笔记——继承、接口、多态

    浮点数的运算需要注意的问题: BigDecimal operand1 = new BigDecimal("1.0"); BigDecimal operand2 = new BigD ...

  9. mysql使用模板解决旧数据处理,默认初始化数据的通用方法!

    一 业务介绍 先来看看我这得大致业务需求,这次业务比较简单: 即从现在开始,每次new一个爷爷都需要默认初始化给这个爷爷三个儿子(子表,爷爷id去关联),并在初始化每个儿子的同时再给每个儿子初始化若干 ...

  10. awk的常用内置函数的使用【转】

    手把手教你在linux下熟悉使用awk的指令结构 (15) 大家好,今天和大家说一下awk吧.反正正则 早晚也要和大家说,不如一点一点和大家先交代清楚了,省得以后和大家说的时候,大家有懵的感觉... ...