Revolving Digits(hdu4333)
Revolving Digits
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 24215 Accepted Submission(s): 5268
For each test cases, there is only one line that is the original integer N. we will ensure that N is an positive integer without leading zeros and N is less than 10^100000.
- 1 #include<stdio.h>
- 2 #include<algorithm>
- 3 #include<iostream>
- 4 #include<string.h>
- 5 #include<stdlib.h>
- 6 #include<math.h>
- 7 #include<cstdio>
- 8 #include<queue>
- 9 #include<stack>
- 10 #include<map>
- 11 char tt[2*100005];
- 12 int extend[2*100005];
- 13 int nex[100005];
- 14 char d[100005];
- 15 char cc[100005];
- 16 int pp[100005];
- 17 void next1(int k);
- 18 void EXkmp(int k,int r);
- 19 using namespace std;
- 20 int main(void)
- 21 {
- 22 int i,j,k,p,q;
- 23 scanf("%d",&k);
- 24 for(int s =1; s<=k; s++)
- 25 {
- 26 memset(nex,0,sizeof(nex));
- 27 memset(extend,0,sizeof(extend));
- 28 scanf("%s",d);
- 29 int l=strlen(d);
- 30 for(i=1; i<=2*l; i++)
- 31 {
- 32 if(i<=l)
- 33 tt[i]=d[i-1];
- 34 else
- 35 tt[i]=d[i-l-1];
- 36 }
- 37 for(i=0; i<l; i++)
- 38 cc[i+1]=d[i];
- 39 j=0;
- 40 pp[0]=0;
- 41 pp[1]=0;
- 42 for(i=2; i<=l; i++)
- 43 {
- 44 while(j>0&&cc[j+1]!=cc[i])
- 45 {
- 46 j=pp[j];
- 47 }
- 48 if(cc[j+1]==cc[i])
- 49 {
- 50 j++;
- 51 }
- 52 pp[i]=j;
- 53 }
- 54 int temp=l/(l-pp[l]);
- 55 if(l%(l-pp[l])!=0)
- 56 {
- 57 temp=1;
- 58 }
- 59 next1(l);
- 60 EXkmp(2*l,l);
- 61 int a[4];
- 62 memset(a,0,sizeof(a));
- 63 for(i=1; i<=l+1; i++)
- 64 {
- 65 if(extend[i]==l)//当匹配数等于l时就相等
- 66 {
- 67 a[1]++;
- 68 }
- 69 else
- 70 {
- 71 if(tt[i+extend[i]]-'0'>cc[extend[i]+1]-'0')//不等于l时比较开始不相等的那位
- 72 {
- 73 a[0]++;
- 74 }
- 75 else a[2]++;
- 76 }
- 77 }
- 78 printf("Case %d: ",s);
- 79 printf("%d %d %d\n",a[2]/temp,(a[1]-1)/temp,a[0]/temp);
- 80
- 81 }
- 82
- 83 }
- 84 void next1(int k)
- 85 {
- 86 int i,j,p;
- 87 j=1;
- 88 int r=j;
- 89 nex[1]=0;
- 90 while(cc[j+1]==cc[j]&&j+1<=k)
- 91 {
- 92 j++;
- 93 }
- 94 nex[2]=j-r;
- 95 int id=2;
- 96 for(i=3; i<=k; i++)
- 97 {
- 98 p=id+nex[id]-1;
- 99 int L=nex[i-id+1];
- 100 int c=i+L-1;
- 101 if(c>=p)
- 102 {
- 103 int j=p-i+1;
- 104 if(j<0)j=0;
- 105 while(cc[j+1]==cc[j+i]&&j+i<=k)
- 106 {
- 107 j++;
- 108 }
- 109 nex[i]=j;
- 110 id=i;
- 111 }
- 112 else nex[i]=L;
- 113 }
- 114 }
- 115
- 116 void EXkmp(int k,int r)
- 117 {
- 118 int i,j;
- 119 j=0;
- 120 while(cc[j+1]==tt[j+1]&&j+1<=r)
- 121 {
- 122 j++;
- 123 }
- 124 extend[1]=j;
- 125 int id=1;
- 126 int p;
- 127 for(i=2; i<=k; i++)
- 128 {
- 129 p=id+extend[id]-1;
- 130 int L=nex[i-id+1];
- 131 int c=i+L-1;
- 132 if(c>=p)
- 133 {
- 134 j=p-i+1;
- 135 j=max(j,0);
- 136 while(cc[j+1]==tt[j+i]&&j+i<=k&&j<=r)
- 137 {
- 138 j++;
- 139 }
- 140 extend[i]=j;
- 141 id=i;
- 142 }
- 143 else extend[i]=L;
- 144 }
- 145 }
Revolving Digits(hdu4333)的更多相关文章
- 【HDU4333】Revolving Digits(扩展KMP+KMP)
Revolving Digits Description One day Silence is interested in revolving the digits of a positive i ...
- 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(扩展KMP)
http://acm.hdu.edu.cn/showproblem.php?pid=4333 题意 一个数字,依次将第一位放到最后一位,问小于本身的数的个数及等于本身的个数和大于本身的个数,但是要注意 ...
- HDU - 4333 Revolving Digits(拓展kmp+最小循环节)
1.给一个数字字符串s,可以把它的最后一个字符放到最前面变为另一个数字,直到又变为原来的s.求这个过程中比原来的数字小的.相等的.大的数字各有多少. 例如:字符串123,变换过程:123 -> ...
- Revolving Digits(hdu 4333)
题意:就是给你一个数字,然后把最后一个数字放到最前面去,经过几次变换后又回到原数字,问在这些数字中,比原数字小的,相等的,大的分别有多少个.比如341-->134-->413-->3 ...
- CodeForces 489C Given Length and Sum of Digits... (贪心)
Given Length and Sum of Digits... 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/F Descr ...
- Codeforces 915 C. Permute Digits (dfs)
题目链接:Permute Digits 题意: 给出了两个数字a,b(<=1e18),保证a,b都不带前缀0.用a的字符重组一个数字使这个值最大且小于b.(保证这个值存在) 题解: 这题遇到了不 ...
- CodeForces 489C Given Length and Sum of Digits... (dfs)
C. Given Length and Sum of Digits... time limit per test 1 second memory limit per test 256 megabyte ...
- UVA-10061 How many zero's and how many digits ? (数论)
题目大意:让求n!在base进制下的位数以及末尾0的连续个数. 题目分析:一个m位的b进制数N,最小是b^(m-1),最大不超过b^m,即b^(m-1)≤N<b^m.解不等式,得log10(N) ...
随机推荐
- 【MarkDown】--使用教程
MarkDown使用教程 目录 MarkDown使用教程 一. 常用设置 1.1 目录 1.2 标题 1.3 文本样式 (1)引用 (2)高亮 (3)强调 (4)水平线 (5)上下标 (6)插入代码 ...
- org.apache.hadoop.hive.ql.metadata.HiveException: Internal Error: cannot generate all output rows for a Partition解决
自己在路径访问明细表开发时,写的sql如下 SELECT guid, sessionid, event['url'] as page, `timestamp` as ts, row_number() ...
- ubuntu18.10搜狗输入法的安装
记录一下 1.卸载ibus ubuntu默认使用ibus管理输入法,官方推荐使用fcitx.我们先卸载ibus sudo apt-get remove ibus 清除ibus配置,如果没有设置 sud ...
- oracle(创建数据库对象)
1 --创建数据库 2 --1.SYSDBA系统权限 3 startup:--启动数据库. 4 shutdown:--关闭数据库. 5 alter database[mount]|[open]|[ba ...
- RHEL 6.5安装系统
转自如下链接: http://www.jb51.net/os/128752.html
- Linux:find命令中
默认情况下, find 每输出一个文件名, 后面都会接着输出一个换行符 ('\n'), 因此我们看到的 find 的输出都是一行一行的: ls -l total 0 -rw-r--r-- 1 root ...
- Spring Boot中使用Mybatis
一.步骤 导入依赖:MySQL驱动.Druid依赖.MyBatis与Spring Boot整合依赖.Lombok依赖 在Service接口实现类上添加@Service注解 在Dao接口上添加@Mapp ...
- 【Services】【Web】【LVS】lvs基础概念
1.简介 1.1. 作者:张文嵩,就职于阿里 1.2. LVS是基础四层路由.四层交换的软件,他根据请求报文的目标IP和目标PORT将其调度转发至后端的某主机: 1.3. IPTABLES的请求转发路 ...
- Linux(CentOS 7)使用gcc编译c,c++代码
安装gcc: 1.使用 yum -list gcc* 查询 centos 官方gcc的所有包: 可安装的软件包 gcc.x86_64 gcc-c++.x86_64 gcc-gfortran.x86_6 ...
- 【力扣】95. 不同的二叉搜索树 II
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的 ...