Revolving Digits
题面
【题目描述】:
有一天,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的更多相关文章
- Revolving Digits[EXKMP]
Revolving Digits Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 【HDU4333】Revolving Digits(扩展KMP+KMP)
Revolving Digits Description One day Silence is interested in revolving the digits of a positive i ...
- 字符串(扩展KMP):HDU 4333 Revolving Digits
Revolving Digits Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 4333 Revolving Digits 扩张KMP
标题来源:HDU 4333 Revolving Digits 意甲冠军:求一个数字环路移动少于不同数量 等同 于的数字 思路:扩展KMP求出S[i..j]等于S[0..j-i]的最长前缀 推断 nex ...
- hdu4333 Revolving Digits(扩展kmp)
Revolving Digits Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 扩展KMP - HDU 4333 Revolving Digits
Revolving Digits Problem's Link Mean: 给你一个字符串,你可以将该字符串的任意长度后缀截取下来然后接到最前面,让你统计所有新串中有多少种字典序小于.等于.大于原串. ...
- HDU - 4333 :Revolving Digits (扩展KMP经典题,问旋转后有多少个不同的数字小于它本身,等于它本身,大于它本身。)
One day Silence is interested in revolving the digits of a positive integer. In the revolving operat ...
- Hdu 4333 Revolving Digits(Exkmp)
Revolving Digits Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- Revolving Digits(hdu4333)
Revolving Digits Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
随机推荐
- AJAX小练习
/index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pa ...
- Linux学习-函式库管理
动态与静态函式库 首先我们要知道的是,函式库的类型有哪些?依据函式库被使用的类型而分为两大类,分别是静态 (Static) 与动态 (Dynamic) 函式库两类. 静态函式库的特色: 扩展名:(扩展 ...
- python基础学习笔记——反射
对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述pyth ...
- 记一次WMS的系统改造(2)-敲定方案
既定改造方案 基于上一篇分析出的种种问题,我们将库房人员的系统操作划分为两大类. 第一类为货物驱动的操作,这类操作主要随着货物而前进,人员不看或者看软件的次数比较少,更多是对货物的状态进行系统上的确认 ...
- Andorid 生成NDK动态链接库 .so库
.so库第一次见到是在搜索Android保存静态秘钥等特殊id字段做法时看到的-通过NDK的方式将静态秘钥保存在so文件中, 关于原生开发工具包(NDK)详细见官网指南要更详细,这里我记录我度娘各种结 ...
- [python][oldboy]list append, extend
# coding=utf8 li = [1, 3, [1, "liu"], "liu"] print li li.append([1, 2]) print li ...
- URAL 1099 Work scheduling 一般图的最大匹配 带花树算法(模板)
R - Work scheduling Time Limit:500MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- STL之set容器的总结
最近做了很多题型,都是用简单的STL就解决了,深刻的感觉到STL的伟大力量,但是本人在遇到问题的时候还是喜欢用常规的算法去解决问题,脑袋笨没办法,有时候根本想不到用STL去解决一些问题 往往都是砍了网 ...
- java面试之String源码中equals具体实现
废话不多说,直接看代码,注释已经写在上面了: public boolean equals(Object anObject) { if (this == anObject) {//比较两个对象的地址 r ...
- [转] Makefile 基础 (2) —— Makefile 总述
该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...