Revolving Digits(hdu 4333)

题意:就是给你一个数字,然后把最后一个数字放到最前面去,经过几次变换后又回到原数字,问在这些数字中,比原数字小的,相等的,大的分别有多少个。比如341-->134-->413-->341,所以和原数字相比,比原数字小的有一个,相等的有一个,大的有一个。

/*
  如果比较两个字符串,就比较第一位不一样的,那我们就需要找出所有字符串和已知字符串的前缀公共部分。
  在已知字符串后面载copy一份,然后做exkmp就行了。
  需要注意的是,相同字符串只能出现一次,所以先求一遍循环节。   有一篇关于exkmp的ppt:http://wenku.baidu.com/view/79992a90bed5b9f3f80f1c16.html?from=search
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 200100
using namespace std;
int Next[N],cas;
char T[N];
void kmp(int m){
    int i=0,j=-1;
    Next[i]=-1;
    while(i<m){
        if(j==-1||T[i]==T[j]){
            i++;j++;Next[i]=j;
        }
        else j=Next[j];
    }
}
void get_Next(){
    int a=0,Tlen=strlen(T);
    Next[0]=Tlen;
    while(a<Tlen-1&&T[a]==T[a+1])a++;
    Next[1]=a;
    a=1;
    for(int k=2;k<Tlen;k++){
        int p=a+Next[a]-1,L=Next[k-a];
        if(k-1+L>=p){
            int j=(p-k+1>0)?p-k+1:0;
            while(k+j<Tlen&&T[k+j]==T[j])j++;
            Next[k]=j;
            a=k;
        }
        else Next[k]=L;
    }
}
int main(){
    int t;scanf("%d",&t);
    while(t--){
        scanf("%s",T);
        int len=strlen(T);
        kmp(len);
        int k=len-Next[len],tt;
        if(len%k==0)tt=len/k;
        else tt=1;
        for(int i=0;i<len;i++) T[len+i]=T[i];
        get_Next();
        int num1=0,num2=0,num3=0;
        for(int i=0;i<len;i++){
            if(Next[i]>=len)num2++;
            else if(T[Next[i]]>T[i+Next[i]])num1++;
            else if(T[Next[i]]<T[i+Next[i]])num3++;
        }
        printf("Case %d: %d %d %d\n",++cas,num1/tt,num2/tt,num3/tt);
    }
    return 0;
}
时间: 2024-10-16 19:37:03

Revolving Digits(hdu 4333)的相关文章

字典树 Trie (HDU 1671)

Problem Description Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let's say the phone catalogue listed these numbers: 1. Emergency 911 2. Alice 97 625 999 3. Bob 91 12 54 26 In this

Valentine&#39;s Day Round 1001.Ferries Wheel(hdu 5174)解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5174 题目意思:给出 n 个人坐的缆车值,假设有 k 个缆车,缆车值 A[i] 需要满足:A[i−1]<A[i]<A[i+1](1<i<K).现在要求的是,有多少人满足,(他坐的缆车的值 + 他左边缆车的值) % INT_MAX == 他右边缆车的值. 首先好感谢出题者的样例三,否则真的会坑下不少人.即同一部缆车可以坐多个人.由于缆车的值是唯一的,所以可以通过排序先排出缆车的位置.求出

最短路 (HDU 2544)

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 28836    Accepted Submission(s): 12480 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

BestCoder Round #70 Jam&#39;s math problem(hdu 5615)

Problem Description Jam has a math problem. He just learned factorization. He is trying to factorize ax^2+bx+cax?2??+bx+c into the form of pqx^2+(qk+mp)x+km=(px+k)(qx+m)pqx?2??+(qk+mp)x+km=(px+k)(qx+m). He could only solve the problem in which p,q,m,

RPG的错排 (HDU 2068)

RPG的错排 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6746    Accepted Submission(s): 2738 Problem Description 今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁.RPG给他机会让他猜猜,第一次猜:R是

BestCoder Round #29 1003 (hdu 5172) GTY&#39;s gay friends [线段树 判不同 预处理 好题]

传送门 GTY's gay friends Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 264    Accepted Submission(s): 57 Problem Description GTY has n gay friends. To manage them conveniently, every morning he o

BestCoder Round #1 1002 项目管理 (HDU 4858)

项目管理 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 738    Accepted Submission(s): 260 Problem Description 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的!两个节点间可能有多条边,不过一条边的两端必然是不同的节点.每个节点都有一个能量值. 现在我

Revolving Digits(扩展Kmp+最小循环节)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4333 Revolving Digits Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 28267    Accepted Submission(s): 6363 Problem Description One day Silence is

Bestcoder13 1003.Find Sequence(hdu 5064) 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5064 题目意思:给出n个数:a1, a2, ..., an,然后需要从中找出一个最长的序列 b1, b2, ...,  bt.需要满足两个条件(1)b1≤b2≤…≤bt   (2)b2−b1≤b3−b2≤?≤bt−bt−1.求出最大的 t 为多少. 遗留大半年的题目呀呀呀呀~~~~!!!首先非常感谢乌冬子大半年前的指点迷津,呕心沥血想了大半天举出个反例,以便指出我算法的错误.为了纪念这个伟大的人物(