标题来源:HDU 4333 Revolving Digits

意甲冠军:求一个数字环路移动少于不同数量 等同 于的数字

思路:扩展KMP求出S[i..j]等于S[0..j-i]的最长前缀 推断 next[i] 大于等于n就是同样 小于n推断S[next[i]]和S[next[i]+i]的大小

next数组的含义就是S字符串以i開始的和S本身(以0開始)的最长公共前缀 把题目输入的复制一倍 然后直接推断next数组 比較大小即可了

#include <cstdio>
#include <cstring>
using namespace std; const int maxn = 200010;
int f[maxn];
char a[maxn]; void getFail(char* s)
{
int n = strlen(s);
int p = 0, k = 1;
for(int i = 0; i+1 < n && s[i] == s[i+1]; i++)
p++;
f[0] = n;
f[1] = p;
for(int i = 2; i < n/2; i++)
{
int p = f[k]+k-1;
int l = f[i-k];
if(i+l-1 < p)
f[i] = l;
else
{
int j = p-i+1;
if(j < 0)
j = 0;
while(i+j < n*2 && s[i+j] == s[j])
j++;
f[i] = j;
k = i;
}
}
}
int main()
{
int cas = 1;
int T;
scanf("%d", &T);
while(T--)
{
scanf("%s", a);
int n = strlen(a);
for(int i = 0; i < n; i++)
{
a[i+n] = a[i];
}
a[2*n] = 0;
getFail(a);
int len;
for(len = 1; len <= n; len++)
{
if(f[len]+len >= n)
{
if(n%len)
len = n;
break;
}
}
int sum1 = 0, sum2 = 0, sum3 = 0;
for(int i = 0; i < len; i++)
{
if(f[i] >= n)
sum2++;
else if(a[i+f[i]] > a[f[i]])
sum3++;
else
sum1++;
}
printf("Case %d: %d %d %d\n", cas++, sum1, sum2, sum3);
}
return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

HDU 4333 Revolving Digits 扩张KMP的更多相关文章

  1. HDU 4333 Revolving Digits 扩展KMP

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4333 题意:给以数字字符串,移动最后若干位到最前边,统计得到的数字有多少比原来大,有多少和原来同样,有多少 ...

  2. HDU 4333 Revolving Digits [扩展KMP]【学习笔记】

    题意:给一个数字,每一次把它的最后一位拿到最前面,一直那样下去,分别求形成的数字小于,等于和大于原来数的个数. SAM乱搞失败 当然要先变SS了 然后考虑每个后缀前长为n个字符,把它跟S比较就行了 如 ...

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

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

  4. 扩展KMP - HDU 4333 Revolving Digits

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

  5. Hdu 4333 Revolving Digits(Exkmp)

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

  6. HDU - 4333 Revolving Digits(扩展KMP)

    http://acm.hdu.edu.cn/showproblem.php?pid=4333 题意 一个数字,依次将第一位放到最后一位,问小于本身的数的个数及等于本身的个数和大于本身的个数,但是要注意 ...

  7. 【扩展kmp+最小循环节】HDU 4333 Revolving Digits

    http://acm.hdu.edu.cn/showproblem.php?pid=4333 [题意] 给定一个数字<=10^100000,每次将该数的第一位放到放到最后一位,求所有组成的不同的 ...

  8. hdu 4333"Revolving Digits"(KMP求字符串最小循环节+拓展KMP)

    传送门 题意: 此题意很好理解,便不在此赘述: 题解: 解题思路:KMP求字符串最小循环节+拓展KMP ①首先,根据KMP求字符串最小循环节的算法求出字符串s的最小循环节的长度,记为 k: ②根据拓展 ...

  9. HDU - 4333 Revolving Digits(拓展kmp+最小循环节)

    1.给一个数字字符串s,可以把它的最后一个字符放到最前面变为另一个数字,直到又变为原来的s.求这个过程中比原来的数字小的.相等的.大的数字各有多少. 例如:字符串123,变换过程:123 -> ...

随机推荐

  1. SQL语句查询数据库的触发器、存储过程、视图以及表的SQL语句

    Sql Server数据库用SQL语句查询方法如下: select name from sysobjects where xtype='TR' --所有触发器 select name from sys ...

  2. 委托、Lambda和事件

    委托 委托相当于C语言当中的函数指针,不过委托是类型安全的类,它定义了返回类型和参数的类型. 声明委托 在C#中使用一个类,分为两个阶段.首先,需要定义这个类,告诉编译器这个类由什么字段和方法组成,然 ...

  3. Python倒计时器(转)

    # Countdown using Tkinter from Tkinter import * import time import tkMessageBox class App: def __ini ...

  4. prepareCall()运行存储过程

    CallableStatement 对象为全部的 DBMS 提供了一种以标准形式调用已储存过程的方法.已储存过程储存在数据库中.对已储存过程的调用是 CallableStatement对象所含的内容. ...

  5. jquery 弹出登陆框,简单易懂!修改密码效果代码

    在网上找了一大堆,看的眼花瞭乱,还是研究原码,自已搞出来了! ui原地址:http://jqueryui.com/dialog/#modal-form 可以把js,css下载到本地,要不然不联网的话, ...

  6. Automatically generate serial number in abap

    流水号的产生:   在ABAP开发中,很多地方都需要按照自己的规则生成流水号,把这些流水号保存进透明表,作为唯一标示. 一. 系统中设定流水号 使用T-Code SNRO来创建一个流水号标识对象. 输 ...

  7. 经常使用的js小方法

    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <% Strin ...

  8. java reflect反思总结

    --------------TestBean package lh.demo.bean; public class TestBean {  private String userName;  priv ...

  9. 添加xml文件编辑语法提示

    找到Struts的lib目录 找到struts2-core-文件并解压开 这个struts.dtd文件才是我们需要添加的文件 双击XML Catalog 点击ADD Key中复制粘贴D:\web\st ...

  10. 如何判断一个Http Message的结束——python源码解读

    HTTP/1.1 默认的连接方式是长连接,不能通过简单的TCP连接关闭判断HttpMessage的结束. 以下是几种判断HttpMessage结束的方式: 1.      HTTP协议约定status ...