[hdu4333]Revolving Digits
/*注意注意:本题非hdu4333原题,而是简化版,原版有多组数据。但此代码在修改输入后依旧可以通过多组数据*/
给出一个数字串,问有多少本质不同同构串比原串小,一样,大.
同构串是指,对于原串S[1-N]通过旋转变成同构串S[i-N]+S[0-i-1].
本质不同,指的是字符串不一样.
输入格式:
一行一个数字串
输出格式:
一行,输出本质不同的同构串比原串小,一样,大的三个数,用一个空格分隔开。
样例输入:
123123
样例输出:
0 1 2
数据范围:
数字串长度<=100000
#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的更多相关文章
- hdu4333 Revolving Digits(扩展kmp)
Revolving Digits Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 【HDU4333】Revolving Digits(扩展KMP+KMP)
Revolving Digits Description One day Silence is interested in revolving the digits of a positive i ...
- Revolving Digits(hdu4333)
Revolving Digits Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Revolving Digits[EXKMP]
Revolving Digits Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 字符串(扩展KMP):HDU 4333 Revolving Digits
Revolving Digits Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 4333 Revolving Digits 扩张KMP
标题来源:HDU 4333 Revolving Digits 意甲冠军:求一个数字环路移动少于不同数量 等同 于的数字 思路:扩展KMP求出S[i..j]等于S[0..j-i]的最长前缀 推断 nex ...
- 扩展KMP - HDU 4333 Revolving Digits
Revolving Digits Problem's Link Mean: 给你一个字符串,你可以将该字符串的任意长度后缀截取下来然后接到最前面,让你统计所有新串中有多少种字典序小于.等于.大于原串. ...
- HDU - 4333 :Revolving Digits (扩展KMP经典题,问旋转后有多少个不同的数字小于它本身,等于它本身,大于它本身。)
One day Silence is interested in revolving the digits of a positive integer. In the revolving operat ...
- Hdu 4333 Revolving Digits(Exkmp)
Revolving Digits Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
随机推荐
- [转载]Google Android开发精华教程
原文地址:Android开发精华教程">Google Android开发精华教程作者:huiyi8zai Android是Google于2007年11月5日宣布的基于Linux平台的开 ...
- Jboss remote getshell (JMXInvokerServlet) vc版
#include "stdafx.h" #include <Windows.h> #include <stdio.h> #include <winht ...
- 回溯法之k着色问题
package main import ( "fmt" ) type Graphic struct { edges [][]int colors int color []int f ...
- rehash过程
步骤 1) 首先创建一个比现有哈希表更大的新哈希表(expand)2) 然后将旧哈希表的所有元素都迁移到新哈希表去(rehash) dictAdd 对字典添加元素的时候, _dictExpandI ...
- python中的字符串的种种函数
1.连接list:为了将任意包含字符串的 list 连接成单个字符串,可以使用字符串对象的 join 方法. join 只能用于元素是字符串的 list:它不进行任何的强制类型转换.连接一个存在一个或 ...
- spring: ?.运算符
?.运算符 对于被调用方法的返回值来说,我们同样可以调用它的方法.例如,如果selectArtist()方法返回的是一个String,那么可以调用toUpperCase()将整个名字改为大写字母形式: ...
- [非原创] 常用加密算法整理 AES/SSL(一)
前言: 在伟大的计算机科学家研究下,发明了许多的加密算法,以下做个简答的描述: 一.分类 加密算法分为两种:单向加密.双向加密. 单向加密,不可逆的加密算法,只能加密不能解密: 双向加密,由对称性加密 ...
- windows下安装virtualenvwrapper之后workon不是内部或外部指令
virtualenvwrapper是虚拟环境的操作,在windows下需要使用以下命令安装: pip install virtualenvwrapper-win 安装win下的环境 相关操作:work ...
- C++循环链表实现约瑟夫退圈(类封装)
node.h #pragma once #include <iostream> #include <iomanip> using namespace std; struct n ...
- 设置SSH自动登陆(免密码,用户名)
设置SSH自动登陆(免密码,用户名) 1.创建公钥.公钥 ssh-keygen -t rsa 无视它出来的任何提示,欢快的一路回车到底吧. 2.把公钥 id_rsa.pub 复制到远程机器的 ...