hdu4333 扩展KMP
慢慢研究可以发现,可以用扩展kmp来求。由于扩展kmp的next[]只有一部分,当前位子前面那部分和母串的后部分,所以可以将字符串复制接在后面一次。
先求如果next[]>0&&next[]!=len,那么只要考虑后面那位的大小比较。如果next[]>=len 那就是相同。如果next[]==0,就是没有相同的,直接比较开头。
这样做还是会超时,我tle无数发。
还要去掉重复的部分,题目要求不同的。所以求出循环部分,只要考虑一部分即可。
//扩展kmp求最小循环节
int kk; // kk保存最短循环节
for(i=; i<=len; ++i)
{
if(i+next[i]>=len)
{
kk = len%i ? len : i;
break;
}
}
#include<stdio.h>
#include<string.h>
#define maxn 100010
char s[maxn],ss[maxn*];
int next[maxn*],n[maxn];
void getnext()
{
int i,j,len=strlen(ss),k;
next[]=len;
i=;
while(i<len-&&ss[i]==ss[i+])
i++;
next[]=i;
int a=;
for(k=;k<len;k++)
{
int p=a+next[a]-;
int l=next[k-a];
if(k-+l>=p)
{
int j=p-k+>?p-k+:;
while(j+k<len&&ss[j+k]==ss[j])
j++;
next[k]=j;
a=k;
}
else next[k]=l;
}
}
void Ekmp()
{
getnext();
int i,j,len=strlen(s),k;
int ansmin,ansequ,ansmax;
ansmin=ansequ=ansmax=;
//扩展kmp求最小循环节
int kk; // kk保存最短循环节
for(i=; i<=len; ++i)
{
if(i+next[i]>=len)
{
kk = len%i ? len : i;
break;
}
}
for(i=;i<kk;i++)
{
if(next[i]==)
{
if(ss[i]>ss[])
ansmax++;
else ansmin++;
}
else if(next[i]>=len)
{
ansequ++;
}
else
{
if(ss[next[i]+i]>ss[next[i]])
{
ansmax++;
}
else ansmin++;
}
}
printf("%d %d %d\n",ansmin,ansequ,ansmax);
}
int main()
{
int i,j,t,ff=,len;
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
len=strlen(s);
int k=;
for(i=;i<len;i++)
ss[k++]=s[i];
for(i=;i<len;i++)
ss[k++]=s[i];
ss[k]='\0';
printf("Case %d: ",++ff);
Ekmp();
}
}
hdu4333 扩展KMP的更多相关文章
- 【HDU4333】Revolving Digits(扩展KMP+KMP)
Revolving Digits Description One day Silence is interested in revolving the digits of a positive i ...
- hdu4333 Revolving Digits(扩展kmp)
Revolving Digits Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 扩展KMP题目
hdu4333 /* 题意:字符串s[0..n-1],每次把最后一个字符放到前面,求形成的字符串比最初串分别小,相同,大于的个数 因为是为了练习扩展KMP所以肯定是扩展KMP, 为了循环方便,在后面复 ...
- 扩展KMP算法
一 问题定义 给定母串S和子串T,定义n为母串S的长度,m为子串T的长度,suffix[i]为第i个字符开始的母串S的后缀子串,extend[i]为suffix[i]与字串T的最长公共前缀长度.求出所 ...
- 扩展KMP --- HDU 3613 Best Reward
Best Reward Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...
- KMP和扩展KMP
文章网上太多这里提一下代码细节: KMP: scanf("%s\n",s); scanf("%s\n",t); int ls=strlen(s),lt=strl ...
- UVA5876 Writings on the Wall 扩展KMP
扩展KMP的简单题. #include<stdio.h> #include<string.h> #define maxn 51010 char s[maxn],t[maxn]; ...
- 扩展KMP
刘雅琼论文 http://wenku.baidu.com/view/8e9ebefb0242a8956bece4b3.html 论文讲的非常详细. 给定母串S,子串T,n=strlen(S),m=st ...
- HDU 3336 扩展kmp
题目大意: 找到字符串中所有和前缀字符串相同的子串的个数 对于这种前缀的问题,通常通过扩展kmp来解决 其实吧这是我第一次做扩展kmp的题目,原来确实看过这个概念,今天突然做到,所以这个扩展kmp的模 ...
随机推荐
- ZOJ 3157 Weapon --计算几何+树状数组
题意:给一些直线,问这些直线在直线x=L,x=R之间有多少个交点. 讲解见此文:http://blog.sina.com.cn/s/blog_778e7c6e0100q64a.html 首先将直线分别 ...
- HTML5和css3的总结二
继续接着昨天的整理 [倒影]:用的不是很多 -webkit-box-reflect:below 20px -webkit-linear-gradient(rgba(0,0,0,0,),rgba(0,0 ...
- ralitive absolute
3.relative与absolute的主要区别: 首先,是上面已经提到过的在正常流中的位置存在与否. 其次,relative定位的层总是相对于其最近的父元素,无论其父元素是何种定位方式.如图3: 图 ...
- Python中的sort()方法使用基础
一.基本形式 sorted(iterable[, cmp[, key[, reverse]]]) iterable.sort(cmp[, key[, reverse]]) 参数解释: (1)itera ...
- [转]仿World Wind构造自己的C#版插件框架——WW插件机制精简改造
很久没自己写东西啦,早该好好总结一下啦!一个大师说过“一个问题不应该被解决两次!”,除了一个好脑筋,再就是要坚持总结. 最近需要搞个系统的插件式框架,我参照World Wind的插件方式构建了个插件框 ...
- Wifi开发技术总结1
摘要: 刚刚接触wifi开发的东西,用的模块是 ESP8266-12E. 资料很多,淘宝地址:https://item.taobao.com/item.htm?spm=a1z09.2.9.10.qGL ...
- Dottrace跟踪代码执行时间
当自己程序遇到性能问题,比如请求反应缓慢,怎么分析是哪里出了问题呢?dottrace可以帮助.net程序跟踪出代码里每个方法的执行时间,这样让我们更清晰的看出是哪里执行时间过长,然后再分析应该怎样解决 ...
- 对RESTful Web API的理解与设计思路
距离上一篇关于Web API的文章(如何实现RESTful Web API的身份验证)有好些时间了,在那篇文章中提到的方法是非常简单而有效的,我在实际的项目中就这么用了,代码经过一段时间的磨合,已经很 ...
- Angular权威指南学习笔记
第一章. 初识Angular--Angular是MVW的Js框架. 第二章. 数据绑定--ViewModel中不仅可以含有变量,还可以还有事件.可以通过事件来控制变量的值改 ...
- 在opencv3中实现机器学习之:利用正态贝叶斯分类
opencv3.0版本中,实现正态贝叶斯分类器(Normal Bayes Classifier)分类实例 #include "stdafx.h" #include "op ...