题面

【题目描述】:

有一天,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);
}
}

最新文章

  1. 一起来玩echarts系列(一)------箱线图的分析与绘制
  2. ASP.NET Core服务器综述
  3. 新手编辑c语言的注意事项
  4. easyui-textbox 和 easyui-validatebox 设置值和获取值
  5. linux安全加固(1)
  6. js首字母大写--单个单词的处理方式
  7. MongoDB的C#驱动程序教程(译) 转
  8. Eclipse中添加web dynamic project
  9. 一个包的libevent流程
  10. TweenMax动画库学习(一)
  11. C#_MVC 自定义AuthorizeAttribute实现权限管理
  12. 0527 python 基础01
  13. JNDI数据源配置注意事项
  14. 巧用*_his表记录操作历史
  15. 单片机C语言基础编程源码六则2
  16. iframe嵌入页面不能全部展示
  17. SuSE的命令安装软件 zypper
  18. Java基础 -- 持有对象(容器)
  19. zsh : command not found pip3 的解决方案
  20. kibana从入门到精通-Kibana配置详解

热门文章

  1. Linux学习-CentOS 7.x 预设启动的服务简易说明
  2. ROM,PROM,EPROM,EEPROM及FLASH存储器的区别
  3. BZOJ 4057: [Cerc2012]Kingdoms
  4. Selenium WebDriver- 隐式等待
  5. 如何安装mongodb.msi
  6. django自定义过滤器和标签
  7. Codeforces Round #410 (Div. 2) B. Mike and strings
  8. Set容器——HashSet及常用API
  9. 性能学习之六---socket接口测试
  10. 【Luogu】P2473奖励关(期望DP)