题面

【题目描述】:

有一天,Silence对可以旋转的正整数十分感兴趣。在旋转操作中,他可以把后面的数字按照原位置不动地搬到剩下位置的前面。当然,他也可以完全不动这串数字。比如,他可以把123变为123,231,312三种。现在他想知道他能得到多少个不同的整数,但他又觉得这个问题太简单了,所以开始思考这所有的整数中有多少个比原数大,有多少个比原数小,又有多少个和原数相等。我们将保证原来的整数是正的,它没有前导0,但如果我们通过旋转得到一个带前导0的数字,我们忽略它的前导0,比如,104旋转后能变成041,我们将它看为41。

【输入描述】:

输入的第一行包含一个整数t(1<=t<=50),这意味着测试数据的组数。

对于每组数据,只有一行包含一个整数n(n<=10^100000),我们将确保n是一个没有前导0的正整数。

【输出描述】:

对于每组数据,请输出一行包括三个整数,输出格式为"Case X: L E G"(不包含双引号),X表示当前数据的组数。L表示通过旋转操作比n小的数字的个数。E表示通过旋转过后等于n的数字的个数。G表示通过旋转操作比n大的数字的个数。

【输入样例】:

1
341

【输出样例】:

Case 1: 1 1 1

题解

首先, 注意到题目要求的整数是"不相同"的, 因此要把原数进行KMP去完整循环节.

然后跑一次扩展KMP, \(match[i]\)表示可以匹配的最大长度, 因此说明

\(match[i] +1\)位是不匹配的, 比较这一位即可.

#include <cstdio>
#include <cstring>
#include <algorithm> const int L = (int)1e5; int main()
{
#ifndef ONLINE_JUDGE
freopen("revolving.in", "r", stdin);
#endif
int t;
scanf("%d", &t);
for(int cs = 1; cs <= t; ++ cs)
{
static char str[L <<1];
scanf("%s", str);
int len = strlen(str);
static int nxt[L];
nxt[0] = -1;
int p = nxt[0];
for(int i = 1; i < len; ++ i)
{
for(; ~ p && str[p + 1] ^ str[i]; p = nxt[p]);
nxt[i] = str[p + 1] == str[i] ? ++ p : p;
}
if(len % (len - nxt[len - 1] - 1) == 0)
len -= nxt[len - 1] + 1;
for(int i = 0; i < len; ++ i)
str[i + len] = str[i];
static int mtch[L << 1];
mtch[0] = (len << 1) - 1;
p = 1;
mtch[p] = -1;
for(; p + mtch[p] + 1 < len << 1 && str[mtch[p] + 1] == str[p + mtch[p] + 1]; ++ mtch[p]);
int mx = p + mtch[p];
for(int i = 1; i < len << 1; ++ i)
{
mtch[i] = std::max(-1, std::min(mx - i, mtch[i - p]));
for(; i + mtch[i] + 1 < len << 1 && str[mtch[i] + 1] == str[i + mtch[i] + 1]; ++ mtch[i]);
if(i + mtch[i] > mx)
p = i, mx = p + mtch[p];
}
int L = 0, E = 1, G = 0;
for(int i = 1; i < len; ++ i)
if(mtch[i] + 1 >= len)
++ E;
else if(str[i + mtch[i] + 1] > str[mtch[i] + 1])
++ G;
else
++ L;
printf("Case %d: %d %d %d\n", cs, L, E, G);
}
}

Revolving Digits的更多相关文章

  1. Revolving Digits[EXKMP]

    Revolving Digits Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  2. 【HDU4333】Revolving Digits(扩展KMP+KMP)

    Revolving Digits   Description One day Silence is interested in revolving the digits of a positive i ...

  3. 字符串(扩展KMP):HDU 4333 Revolving Digits

    Revolving Digits Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  4. HDU 4333 Revolving Digits 扩张KMP

    标题来源:HDU 4333 Revolving Digits 意甲冠军:求一个数字环路移动少于不同数量 等同 于的数字 思路:扩展KMP求出S[i..j]等于S[0..j-i]的最长前缀 推断 nex ...

  5. hdu4333 Revolving Digits(扩展kmp)

    Revolving Digits Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  6. 扩展KMP - HDU 4333 Revolving Digits

    Revolving Digits Problem's Link Mean: 给你一个字符串,你可以将该字符串的任意长度后缀截取下来然后接到最前面,让你统计所有新串中有多少种字典序小于.等于.大于原串. ...

  7. HDU - 4333 :Revolving Digits (扩展KMP经典题,问旋转后有多少个不同的数字小于它本身,等于它本身,大于它本身。)

    One day Silence is interested in revolving the digits of a positive integer. In the revolving operat ...

  8. Hdu 4333 Revolving Digits(Exkmp)

    Revolving Digits Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...

  9. Revolving Digits(hdu4333)

    Revolving Digits Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

随机推荐

  1. QT添加自定义信号后编译出现undefined reference

    QT添加自定义信号后编译出现undefined reference 这是需要重新生成qmake: build --->run qmake

  2. POJ 1791 Parallelogram Counting(求平行四边形数量)

    Description There are n distinct points in the plane, given by their integer coordinates. Find the n ...

  3. Leetcode 559. N叉树的最大深度

    题目链接 https://leetcode-cn.com/problems/maximum-depth-of-n-ary-tree/description/ 题目描述 给定一个N叉树,找到其最大深度. ...

  4. tar.xz结尾的文件的解压缩方法

    例如: codeblocks-13.12-1_i386.debian.stable.tar 这个压缩包也是两层压缩,外面是xz压缩方式,里层是tar压缩方式. 解压缩方法: $xz -d ***.ta ...

  5. Oracle 表空间的日常维护与管理

    目录 Oracle 表空间的日常维护与管理 1.创建数据表空间 2.创建临时表空间 3.创建 UNDO 表空间 4.表空间的扩展与修改大小 5.表空间重命名 6.表空间的删除 7.更改表空间的读写模式 ...

  6. Leetcode23--->Merge K sorted Lists(合并k个排序的单链表)

    题目: 合并k个排序将k个已排序的链表合并为一个排好序的链表,并分析其时间复杂度 . 解题思路: 类似于归并排序的思想,lists中存放的是多个单链表,将lists的头和尾两个链表合并,放在头,头向后 ...

  7. Python字典类型、

    字典类型: # msg_dic = {#     'apple': 10,#     'tesla': 100000,#     'mac': 3000,#     'lenovo': 30000,# ...

  8. [python学习篇] [os模块] [2]删除文件夹

    def deleteDirectory(self,current_path): if not os.path.exists(current_path): self.logger.info(curren ...

  9. Navicat数据库备份还原

    Navicat数据库备份包括数据和架构 还原数据库:把备份文件复制到备份文件夹所在位置,还原即可

  10. Dropbox面向第三方开发者推出全新的Datastore API

    Dropbox今天推出了全新的高级的同步API,开发者可以使用Dropbox的技术同步跨设备app的数据. Datastore API在现有的Dropbox Sync API基础上进行了扩展,允许开发 ...