hdu4333Revolving Digits

2024-05-05 05:48
文章标签 digits hdu4333revolving

本文主要是介绍hdu4333Revolving Digits,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目大意:

依次将最后面的数字往第一位移动,求得出的这些结果中大于等于小于原数的个数;

解题思路:

为了保证结果的正确性,首先的去重,诸如123123这样的字符串,我们只要计算123这种情况即可,去重可以利用KMP求出循环节即可,最后将循环节复制成两份相同的再拓展kmp比较大小!

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int MAX=100000+10;
char s[MAX*2];
int next[MAX];
//kmp为了求循环节
void get_next(char *a,int len)
{int i=-1,j=0;next[0]=-1;while(j<len){if(i == -1 || a[i] == a[j])next[++j]=++i;elsei=next[i];}
}
//拓展kmp
void get_extend(char *a,int len)
{int k=0,i=1,maxr;next[0]=len;while(k+1<len && a[k] == a[k+1])++k;next[1]=k;k=1;while(++i<len/2){//只需要求到原串的长度即可maxr=k+next[k]-1;next[i]=min(next[i-k],max(maxr-i+1,0));while(i+next[i]<len && a[next[i]] == a[i+next[i]])++next[i];if(i+next[i]>k+next[k])k=i;}
}
int main(){int t,num=0;cin>>t;while(t--){scanf("%s",s);int len=strlen(s);get_next(s,len);int temp=len-next[len];if(len%temp!=0)temp=len;for(int i=0;i<=temp;++i)s[i+len]=s[i];get_extend(s,temp+temp);int a=0,b=0,c=0;for(int i=0;i<temp;++i){if(next[i]>=temp)++b;//表示等于原串的else if(s[next[i]]<s[i+next[i]])++c;//表示大于原串的else++a;//表示小于原串的}cout<<"Case "<<++num<<": "<<a<<' '<<b<<' '<<c<<endl;}return 0;
}


这篇关于hdu4333Revolving Digits的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/960919

相关文章

uva 10061 How many zero's and how many digits ?(不同进制阶乘末尾几个0)+poj 1401

题意是求在base进制下的 n!的结果有几位数,末尾有几个0。 想起刚开始的时候做的一道10进制下的n阶乘末尾有几个零,以及之前有做过的一道n阶乘的位数。 当时都是在10进制下的。 10进制下的做法是: 1. n阶位数:直接 lg(n!)就是得数的位数。 2. n阶末尾0的个数:由于2 * 5 将会在得数中以0的形式存在,所以计算2或者计算5,由于因子中出现5必然出现2,所以直接一

ural 1014. Product of Digits贪心

1014. Product of Digits Time limit: 1.0 second Memory limit: 64 MB Your task is to find the minimal positive integer number  Q so that the product of digits of  Q is exactly equal to  N. Inpu

【FZU】2105 Digits Count 线段树

传送门:【FZU】2105 Digits Count 题目分析:与、或、异或三种操作都是每一位相互独立的,所以可以将线段树建四棵,分别对应一位,and和or操作相当于覆盖操作,xor操作相当于反转操作,就和普通的线段树方法类似,设立两个lazy标记即可。查询的时候求得每一位的1的个数*权重(1,2,4,8),全部累加就是答案。 代码如下: #include <cst

Subtract the Product and Sum of Digits of an Integer

Given an integer number n, return the difference between the product of its digits and the sum of its digits. Example 1: Input: n = 234Output: 15 Explanation: Product of digits = 2 * 3 * 4 = 24

java 2.6** Summing the digits in an integer

例如 : 999 process: sum=9+9+9=27; 例如 : 932 process: sum=9+3+2=14;   import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner input=new Scanner(System.in);int

codeforces 289 C Sums of Digits

贪心,做了两个半小时没做出来!主要在于求有k位且恰比某个数大的最小值,从左到右检查可以加1的位,若后面的位满足条件,再根据solve中的方法满足条件的最小值。 #include<iostream>#include<string>#include<cstring>#include<cstdio>#include<cmath>#include<iomanip>#include<map

F - Problem where +s Separate Digits

算第三遍了。。都没有想透 。。 而且这题的解法非常多样。。有正序 逆序 递推的方式也非常多。 下面是找到的一个感觉相对比较简洁的。(核心代码) 有兴趣再看吧。。先pass了。 //上面都是mod的模版部分 省略掉 下面才是核心代码Z base[N], p[N];void solve() {string s;cin >> s;n = s.size();base[0] = 1;p[0] = 1

Add Digits问题及解法

问题描述: Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. 示例: Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one digit

HDU 4333 Revolving Digits 扩展KMP

题目来源:HDU 4333 Revolving Digits 题意:求一个数字循环移动后有多少个不同的小于 等于 大于的数字 思路:扩展KMP求出S[i..j]等于S[0..j-i]的最长前缀 判断 next[i] 大于等于n就是相同 小于n判断S[next[i]]和S[next[i]+i]的大小 next数组的含义就是S字符串以i开始的和S本身(以0开始)的最长公共前缀 把题目输入的复制一

uva11198 Dancing Digits

简单题,直接暴力,而且不需要太多剪枝就能过。 忘了写insert函数的返回值导致wa一次,怎么感觉oj上的编译器和我电脑上的g++不一样 #include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define HASHSIZE 40000#define MAX 50000using namespac