/*注意注意:本题非hdu4333原题,而是简化版,原版有多组数据。但此代码在修改输入后依旧可以通过多组数据*/

给出一个数字串,问有多少本质不同同构串比原串小,一样,大.
同构串是指,对于原串S[1-N]通过旋转变成同构串S[i-N]+S[0-i-1].
本质不同,指的是字符串不一样.

输入格式:

一行一个数字串

输出格式:

一行,输出本质不同的同构串比原串小,一样,大的三个数,用一个空格分隔开。

样例输入:

123123

样例输出:

0 1 2

数据范围:

数字串长度<=100000

 
 
 
 
首先,我们用KMP求得KMP中的next数组nex,这有什么用呢?其功能在于求出原字符串的循环节个数,以此保证计数的字符串本质不同
然后,设原字符串为s2,字符串s1=s2+s2。以s1为母串,s2为子串跑EKMP。
最后,对于每一个ex[i],大于等于s2的长度即从第i个位置开始的组成的数与原数相等,否则只要比较s[i]与s[i+next[i]](EKMP的next)。
 
 
#include<cstdio>
#include<cstring>
using namespace std;
char s1[],s2[];
int ex[],nxt[],nex[];
void get(char *s2){
int m=strlen(s2);
nex[]=nex[]=;int j=;
for(int i=;i<m;i++){
while(j>&&s2[i]!=s2[j])j=nex[j];
if(s2[i]==s2[j])j++;
nex[i+]=j;
}
}
void getex(char *s2){
int j=,n=strlen(s2);
while(j+<n&&s2[j+]==s2[j])j++;
nxt[]=n;nxt[]=j;int po=,p=nxt[]+;
for(int i=;i<n;i++){
int len=nxt[i-po];
if(len+i<p)nxt[i]=len;
else{
int j=p-i;
if(j<)j=;
while(i+j<n&&s2[j]==s2[j+i])j++;
nxt[i]=j;
po=i;
p=nxt[po]+po;
}
}
}
void exkmp(char *s1,char *s2){
int j=,n=strlen(s1),m=strlen(s2);
while(s1[j]==s2[j]&&j<n&&j<m)j++;
ex[]=j;int po=,p=ex[];
for(int i=;i<n;i++){
int len=nxt[i-po];
if(len+i<p)ex[i]=len;
else{
int j=p-i;
while(i+j<n&&j<m&&s1[j+i]==s2[j])j++;
ex[i]=j;
po=i;
p=ex[po]+po;
}
}
}
int main(){
scanf("%s",s2);int len=strlen(s2);
for(int i=;i<len;i++)
s1[i]=s2[i],s1[i+len]=s2[i];
getex(s2);
exkmp(s1,s2);
get(s2); int temp=len%(len-nex[len])==?len/(len-nex[len]):;
int a=,b=,c=;
for(int i=;i<len;i++){
if(ex[i]>=len)b++;
else if(s1[i+ex[i]]<s2[ex[i]])a++;
else c++;
}
printf("%d %d %d",a/temp,b/temp,c/temp);
}
 
 
 
 
 
 
 
 

[hdu4333]Revolving Digits的更多相关文章

  1. hdu4333 Revolving Digits(扩展kmp)

    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. Revolving Digits(hdu4333)

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

  4. Revolving Digits[EXKMP]

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

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

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

  6. HDU 4333 Revolving Digits 扩张KMP

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

  7. 扩展KMP - HDU 4333 Revolving Digits

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

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

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

  9. Hdu 4333 Revolving Digits(Exkmp)

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

随机推荐

  1. HBase学习2(HBase shell)

    HBase 常用命令 查看当前用户:whoami 创建表:create '表名', '列族名1','列族名2','列族名N' 查看所有表:list 描述表: describe '表名' 判断表存在: ...

  2. HDU 5877 Weak Pair (2016年大连网络赛 J dfs+反向思维)

    正难则反的思想还是不能灵活应用啊 题意:给你n个点,每个点有一个权值,接着是n-1有向条边形成一颗有根树,问你有多少对点的权值乘积小于等于给定的值k,其中这对点必须是孩子节点与祖先的关系 我们反向思考 ...

  3. Linux下DB2的TCP配置

    1切换到db2实例用户下(uppdb) su - uppdb 2查看db2是否开启tcp服务 db2set -all 设置tcp服务:db2set DB2COMM=TCPIP 3查看是否配置db2 t ...

  4. JQuery调用iframe子页面函数/对象的方法例子

    父页面有个ID为mainfrm.name为Iframe1的iframe,iframe连接b.html,该页面有个函数test 在父页面调用b.html的test方法为: $("#mainfr ...

  5. css3——transition属性和opacity属性

    [transition-duration] 是一个css3属性,规定完成过度效果需要花费的时间(一秒或毫秒计).语法:transition-duration: time;time :    规定完成过 ...

  6. 《Advanced Bash-scripting Guide》学习(三):自删除脚本和自读取内容的脚本

    本文所选的例子来自于<Advanced Bash-scripting Gudie>一书,译者 杨春敏 黄毅 自删除脚本 #!/bin/rm #自删除脚本 #当你运行这个脚本时,基本上什么都 ...

  7. 简单CSS3动画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. linux(ubuntu16.04)下安装和破解pycharm专业版

    我用的linux 版本是ubuntu,查看版本命令是: lsb_release -a 因为学习Python爬虫,pycharm是Python很好用的IDE,但是专业版需要付费,所以开始安装: 首先在官 ...

  9. C#中的线程(一)入门

    C#中的线程(一)入门   Keywords:C# 线程Source:http://www.albahari.com/threading/Author: Joe AlbahariTranslator: ...

  10. (转)android头像设置:从本地照片库或拍照获取并剪裁

    本文转载于:http://blog.csdn.net/sheeprunning/article/details/9184021 功能介绍 制作android应用时,用户注册的功能必不可少,往往还需要具 ...