/*注意注意:本题非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. EF与手写Model的区别以及联系

    1.在数据库表名上,EF是随意的,但是如果是Model的话,就应该在建立数据库的时候考虑到讲数据库表名变为复数,如Movie.cs 数据库应该为Movies

  2. java基础(5)-集合类1

    集合的由来 数组是很常用的一种数据结构,但假如我们遇到以下这样的的问题: 容器长度不确定 能自动排序 存储以键值对方式的数据 如果遇到这样的情况,数组就比较难满足了,所以也就有了一种与数组类似的数据结 ...

  3. php+JS进度条

    <?phpini_set('max_execution_time','0');//设置本页面加载时间无限制 echo "<div style='border: 1px solid ...

  4. Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset trie树

    D. Vasiliy's Multiset time limit per test 4 seconds memory limit per test 256 megabytes input standa ...

  5. javascript语言历史

    起初,web站点事实上只不过是一个静态的HTML文档集,这些文档之间仅依靠一些简单的超链接(Hyperlinks)绑定在一起. 但很快,随着Web业务的快速普及和增长,网站管理者越来越希望自己所创建的 ...

  6. array_merge函数的注意事项

    array_merge — 合并一个或多个数组 array_merge() 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面.返回作为结果的数组 如果输入的数组中有相同的字符串键名 ...

  7. DecimalFormat数据格式函数

    DecimalFormat数据格式函数 class FormatDemo2{ public void format(String pattern, double value) { DecimalFor ...

  8. JavaScript 编程模式

    编程模式,是源自经验和探索总结出的最佳实践方案,既有助于可读性和可维护性,也有助于提升整体性能. 行为隔离 总则:结构.样式和行为之间两两隔离. 避免在结构中使用内联事件 尽量少用 <scrip ...

  9. uva 10739 dp

    https://vjudge.net/problem/UVA-10739 和昨天的那个回文串几乎一样只是加了条件限制,可以随意增删以及替换. #include<iostream> #inc ...

  10. SpringTask定时任务实例讲解【Java获取微信公众平台accessToken及jsapiTicket】

    项目中调用微信公众平台的接口时,因为获取到的accessToken及jsapiTicket有效时长只有两个小时,需要不断更新. 所以做了个定时任务,记录一下. .SpringTask实现有两种方式,一 ...