hdu 4333(扩展kmp)
题意:就是给你一个数字,然后把最后一个数字放到最前面去,经过几次变换后又回到原数字,问在这些数字中,比原数字小的,相等的,大的分别有多少个。比如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)的更多相关文章
- hdu 4333 扩展kmp+kmp重复字串去重
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4333 关于kmp next数组求最短重复字串问题请看:http://www.cnblogs.com/z ...
- HDU 3336 扩展kmp
题目大意: 找到字符串中所有和前缀字符串相同的子串的个数 对于这种前缀的问题,通常通过扩展kmp来解决 其实吧这是我第一次做扩展kmp的题目,原来确实看过这个概念,今天突然做到,所以这个扩展kmp的模 ...
- HDU 6153 扩展kmp
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others)Total ...
- HDU 3613 扩展KMP
暴力枚举大水题,判断回文,扩展KMP #include <cstdio> #include <cstring> #include <algorithm> using ...
- HDU 2594 扩展kmp模板题
题目大意: 给定两个字符串,在第一个字符串中找到一个最大前缀作为第二个字符串的后缀 #include <iostream> #include <cstdio> #include ...
- hdu 3613 扩展kmp+回文串
题目大意:给个字符串S,要把S分成两段T1,T2,每个字母都有一个对应的价值,如果T1,T2是回文串(从左往右或者从右往左读,都一样),那么他们就会有一个价值,这个价值是这个串的所有字母价值之和,如果 ...
- HDU 6153 A Secret(扩展KMP模板题)
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others) Total ...
- HDU 4333 Revolving Digits 扩展KMP
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4333 题意:给以数字字符串,移动最后若干位到最前边,统计得到的数字有多少比原来大,有多少和原来同样,有多少 ...
- HDU - 4333 Revolving Digits(扩展KMP)
http://acm.hdu.edu.cn/showproblem.php?pid=4333 题意 一个数字,依次将第一位放到最后一位,问小于本身的数的个数及等于本身的个数和大于本身的个数,但是要注意 ...
随机推荐
- Android核心分析之二十七Android GDI 之SurfaceFlinger之动态结构示
SurfaceFlinger对象建立过程示意 1 SurfaceSession的建立 客户端请求建立Surface时,首先在要与SurfaceFlinger建立一个Session,然后再 ...
- 对所有CPU寄存器的简述(16位CPU14个,32位CPU16个)
32位CPU所含有的寄存器有:4个数据寄存器(EAX.EBX.ECX和EDX)2个变址和指针寄存器(ESI和EDI)2个指针寄存器(ESP和EBP)6个段寄存器(ES.CS.SS.DS.FS和GS)1 ...
- linux 操作系统下c语言编程入门
2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Linux程序设计入门--消息管理 ...
- ThreadLocal的几种误区
最近由于需要用到ThreadLocal,在网上搜索了一些相关资料,发现对ThreadLocal经常会有下面几种误解 一.ThreadLocal是java线程的一个实现 ThreadLoca ...
- ACMer(转)
我所了解的ACMer主要分为以下几类: A类:天才型(这个在咱们学校基本不存在),所以就不用考虑了-_- ! B类:刷题很快,题数是最多的几个之一,但有一个习惯就是喜欢看题解,思考问题一想不出来了就想 ...
- iphone/ipad实现自定义的开关UISwitch(continuous,clipsToBounds,userInteractionEnabled属性)
这里主要讲几个UIView的几个属性,具体大家可以下载代码看看, 下载地址是: http://download.csdn.net/detail/rhljiayou/5960003 实现效果是: 代码中 ...
- 笔记一、Git服务器【转】
传输协议: 本地传输,SSH协议,Git协议,HTTP协议 git clone /home/git/project.git // 本地clone git ...
- Android端通过HttpURLConnection上传文件到服务器
Android端通过HttpURLConnection上传文件到服务器 一:实现原理 最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HT ...
- java验证码-汉字验证码
今天整理了一个java实现的汉字输入验证码 主要包含两个类,一个是生成验证码,一个是判断验证码输入是否正确 实现原理非常简单,将汉字和干扰线生成图片并将汉字保存到session,前台获取每次生成验证码 ...
- YTU 2618: B 求类中数据成员的最大值-类模板
2618: B 求类中数据成员的最大值-类模板 时间限制: 1 Sec 内存限制: 128 MB 提交: 430 解决: 300 题目描述 声明一个类模板,类模板中有三个相同类型的数据成员,有一函 ...