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

分析:经过观察,其实就是求每一位的后缀与自身的最长公共前缀,这个显然可以用扩展kmp处理,但是开始的时候我超时了,后来在网上看到别人把这个串后面再接上本身,以它为主串,然后以自身为模板串进行扩展kmp,这样处理把时间复杂度降到了线性的,最后要注意的一个问题就是如何避免重复了,我们可以用普通的kmp求出此串的最小循环节,如果构成完整的循环,那么我们要算的就是循环节长度的情况了!

代码实现:

#include<stdio.h>
#include<string.h>
char S[],T[];
int next[],extend[],len,node; void get_node()
{
int i=,j=-;
next[]=-;
while(i<len)
{
if(j==-||T[i]==T[j])
{
i++;j++;
next[i]=j;
}
else
j=next[j];
}
node=len-next[len];
} void get_next()
{
int a,p,k,j,len;
int L;
len=strlen(T);
next[]=len;
a=;
while(a<len-&&T[a]==T[a+])
a++;
next[]=a;
a=;
for(k=;k<len;k++)
{
p=a+next[a]-;
L=next[k-a];
if(k-+L>=p)
{
j=p-k+>?p-k+:;
while(j+k<len&&T[j+k]==T[j])
j++;
next[k]=j;
a=k;
}
else
next[k]=L;
}
} void get_extend()
{
get_next();
int a,p,L,k,j,slen,tlen,len;
slen=strlen(S);tlen=strlen(T);
len=slen>tlen?tlen:slen;
a=;
while(a<len&&S[a]==T[a])
a++;
extend[]=a;
a=;
for(k=;k<slen;k++)
{
p=a+extend[a]-;
L=next[k-a];
if(k-+L>=p)
{
j=p-k+>?p-k+:;
while(j+k<slen&&j<tlen&&S[j+k]==T[j])
j++;
extend[k]=j;
a=k;
}
else
extend[k]=L;
}
} void solve()
{
int i,num1=,num2=,num3=,flag;
if(len%node!=)
node=len;
for(i=;i<node;i++)
{
if(extend[i]>=len)
num2++;
else if(S[extend[i]]>S[i+extend[i]])
num1++;
else if(S[extend[i]]<S[i+extend[i]])
num3++;
}
printf("%d %d %d\n",num1,num2,num3);
} int main()
{
int t,i;
scanf("%d",&t);
getchar();
for(i=;i<=t;i++)
{
scanf("%s",T);
strcpy(S,T);
strcat(S,T);
len=strlen(T);
get_node();
get_next();
get_extend();
printf("Case %d: ",i);
solve();
}
return ;
}

hdu 4333(扩展kmp)的更多相关文章

  1. hdu 4333 扩展kmp+kmp重复字串去重

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4333 关于kmp next数组求最短重复字串问题请看:http://www.cnblogs.com/z ...

  2. HDU 3336 扩展kmp

    题目大意: 找到字符串中所有和前缀字符串相同的子串的个数 对于这种前缀的问题,通常通过扩展kmp来解决 其实吧这是我第一次做扩展kmp的题目,原来确实看过这个概念,今天突然做到,所以这个扩展kmp的模 ...

  3. HDU 6153 扩展kmp

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others)Total ...

  4. HDU 3613 扩展KMP

    暴力枚举大水题,判断回文,扩展KMP #include <cstdio> #include <cstring> #include <algorithm> using ...

  5. HDU 2594 扩展kmp模板题

    题目大意: 给定两个字符串,在第一个字符串中找到一个最大前缀作为第二个字符串的后缀 #include <iostream> #include <cstdio> #include ...

  6. hdu 3613 扩展kmp+回文串

    题目大意:给个字符串S,要把S分成两段T1,T2,每个字母都有一个对应的价值,如果T1,T2是回文串(从左往右或者从右往左读,都一样),那么他们就会有一个价值,这个价值是这个串的所有字母价值之和,如果 ...

  7. HDU 6153 A Secret(扩展KMP模板题)

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others) Total ...

  8. HDU 4333 Revolving Digits 扩展KMP

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4333 题意:给以数字字符串,移动最后若干位到最前边,统计得到的数字有多少比原来大,有多少和原来同样,有多少 ...

  9. HDU - 4333 Revolving Digits(扩展KMP)

    http://acm.hdu.edu.cn/showproblem.php?pid=4333 题意 一个数字,依次将第一位放到最后一位,问小于本身的数的个数及等于本身的个数和大于本身的个数,但是要注意 ...

随机推荐

  1. 卷积相关公式的matlab代码

    取半径=3 用matlab代码实现上式公式: length=3;for Ki = 1:length for Kj = 1:length for Kk = 1:length Ksigma(Ki,Kj,K ...

  2. 【Apache运维基础(2)】主配置文件说明

    ServerTokens OS 系统信息,在访问出错时出现;把OS改为Minor,就不显示系统信息 ServerSignature On 把On改为Off就连普通的系统都给隐藏起来;改为Email就会 ...

  3. linux下tomcat下部署项目如何打包压缩备份

    范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar[root@linux ~]# tar -cvf /tmp/etc.tar /etc <==仅打包,不压缩![root ...

  4. Android核心分析之二十八Android GDI之Surface&Canvas

    Surface&Canvas Canvas为在画布的意思.Android上层的作图几乎都通过Canvas实例来完成,其实Canvas更多是一种接口的包装.drawPaints ,drawPoi ...

  5. C语言,一个彩票摇奖程序摇出22选5的中奖号码

    摇奖机摇奖,无非就是利用它的随机性,让球从摇奖机中随机地掉出,就成了中奖号码.而C语言中也同样有个rand()函数可以产生随机数,利用这个rand()函数产生的随机数,同样可以代替从摇奖机中随机摇出的 ...

  6. Linux下查看进程和线程

    在linux中查看线程数的三种方法 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行显示一个进程. 2.ps xH 手册 ...

  7. [软件]XAMPP错误解决

    // 错误1  (在运行安装包时候出现) // 错误2 1. 找到这个文件 这个文件  要将 config.inc.php 中 $cfg['Servers'][$i]['host'] = ’local ...

  8. 297. Serialize and Deserialize Binary Tree

    题目: Serialization is the process of converting a data structure or object into a sequence of bits so ...

  9. springboot源码解析 - 构建SpringApplication

    1 package com.microservice.framework; 2 3 import org.springframework.boot.SpringApplication; 4 impor ...

  10. 深入理解Java内存模型(三)——顺序一致性

    数据竞争与顺序一致性保证 当程序未正确同步时,就会存在数据竞争.java内存模型规范对数据竞争的定义如下: 在一个线程中写一个变量, 在另一个线程读同一个变量, 而且写和读没有通过同步来排序. 当代码 ...