/*注意注意:本题非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. 设置本地wamp环境挂载多站点同时运行

    之前写过一篇关于在Linux环境下配置虚拟主机的文章:现在又有一种场景:在本地同时写多个项目:可本地的wamp环境下默认只有一个www目录:这样经常修改目录很痛苦:那么幸福就这么猝不及防的来了:下面就 ...

  2. 搭建confluence参考文献

    https://www.cnblogs.com/kevingrace/p/7607442.html https://yq.aliyun.com/articles/144747?t=t1 jira: h ...

  3. QT 事件处理 KeyPressEvent 和 定时器时间 Timer

    1. 按键事件响应, 两种方法,一种直接处理Event,过滤出KeyPress,另一种直接处理KeyPressEvent. bool Dialog::event(QEvent *e) { if( e- ...

  4. 虚拟机CentOS6.5网络配置

    不得不说  6.5比7.0麻烦了许多.. 编辑ifcfg配置文件 vi /etc/sysconfig/network-script/ifcfg-eth0 内容如下 DEVICE=eth0 HWADDR ...

  5. 微信小程序申请。很蛋疼的流程。

    微信小程序申请. 营业执照,食品许可证,身份证正面,身份证反面. 1.先要申请服务号. 需要一个QQ邮箱,申请服务号. 填写各种信息,营业执照信息. 法人信息. 管理员用自己人的.方便开发操作. 申请 ...

  6. openstack havana块存储Cinder磁盘加密方法研究

    http://blog.csdn.net/cloudresearch/article/details/19092219 在openstack havana的release note中有如下介绍“Att ...

  7. JDBC方式操作数据库

    1.读取配置文件,我将配置信息写入配置文件(.properties)中,方便后期数据库变更后或者其他项目使用,扩展性好些,尽量避免硬编码. driver=oracle.jdbc.driver.Orac ...

  8. MRC与ARC混合编程的编译器标记

    如果是MRC项目创建ARC源文件,给这个源文件加上 -fobjc-arc 的编译器标记, 如果是ARC项目创建MRC源文件,给这个源文件加上 -fno-objc-arc 的编译器标记. 步骤: 1. ...

  9. coco2d-js 节点的属性和动作

    记录一些coco简单的属性和动作,位置,锚点,透明度,大小,移动等 /*属性*/ if(!true){ var sprite1 = new cc.Sprite(res.Sp1); var sprite ...

  10. ZeroClipboard 简单应用

    ZeroClipboard.config({ swfPath: "/scripts/ZeroClipboard.swf" }); var client = new ZeroClip ...