慢慢研究可以发现,可以用扩展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的更多相关文章

  1. 【HDU4333】Revolving Digits(扩展KMP+KMP)

    Revolving Digits   Description One day Silence is interested in revolving the digits of a positive i ...

  2. hdu4333 Revolving Digits(扩展kmp)

    Revolving Digits Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. 扩展KMP题目

    hdu4333 /* 题意:字符串s[0..n-1],每次把最后一个字符放到前面,求形成的字符串比最初串分别小,相同,大于的个数 因为是为了练习扩展KMP所以肯定是扩展KMP, 为了循环方便,在后面复 ...

  4. 扩展KMP算法

    一 问题定义 给定母串S和子串T,定义n为母串S的长度,m为子串T的长度,suffix[i]为第i个字符开始的母串S的后缀子串,extend[i]为suffix[i]与字串T的最长公共前缀长度.求出所 ...

  5. 扩展KMP --- HDU 3613 Best Reward

    Best Reward Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...

  6. KMP和扩展KMP

    文章网上太多这里提一下代码细节: KMP: scanf("%s\n",s); scanf("%s\n",t); int ls=strlen(s),lt=strl ...

  7. UVA5876 Writings on the Wall 扩展KMP

    扩展KMP的简单题. #include<stdio.h> #include<string.h> #define maxn 51010 char s[maxn],t[maxn]; ...

  8. 扩展KMP

    刘雅琼论文 http://wenku.baidu.com/view/8e9ebefb0242a8956bece4b3.html 论文讲的非常详细. 给定母串S,子串T,n=strlen(S),m=st ...

  9. HDU 3336 扩展kmp

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

随机推荐

  1. HDU 4793 Collision --解方程

    题意: 给一个圆盘,圆心为(0,0),半径为Rm, 然后给一个圆形区域,圆心同此圆盘,半径为R(R>Rm),一枚硬币(圆形),圆心为(x,y),半径为r,一定在圆形区域外面,速度向量为(vx,v ...

  2. 第8课 goto 和 void 分析

    1. 遭人遗弃的goto (1)高手潜规则:禁用goto (2)项目经验:程序质量与goto出现的次数成反比 (3)最后的判决:将goto打入冷宫(1)循环语句的基本工作方式 [实例分析]goto副作 ...

  3. AC日记——搞笑世界杯 codevs 1060(dp)

    题目描述 Description 随着世界杯小组赛的结束,法国,阿根廷等世界强队都纷纷被淘汰,让人心痛不已. 于是有 人组织了一场搞笑世界杯,将这些被淘汰的强队重新组织起来和世界杯一同比赛.你和你的朋 ...

  4. Android Studio系列教程六--Gradle多渠道打包

    Android Studio系列教程六--Gradle多渠道打包 2015 年 01 月 15 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzh ...

  5. PHP mcrypt加密扩展使用总结

    在开发中,很多时候我们在前后端交互中需要对一些敏感数据进行一定的加密.PHP中有提供了mcrypt的这样一个加密扩展实现对数据的加密解密. 一.mcrypt扩展的安装 在低版本的PHP中需要在配置文件 ...

  6. Gradle多项目构建

    1. 创建项目 首先创建项目,名称为 test: mkdir test && cd test gradle init 这时候的项目结构如下: ➜ test tree . ├── bui ...

  7. WP 8.1 中挂起时页面数据保存方式

    1.保存到Applicaion Data配置信息中: 保存: private void testTB_TextChanged(object sender, TextChangedEventArgs e ...

  8. discourse 基于ember.js+rails项目的安装部署

    最近公司在讨论做一个ERP运维问答的论坛系统,看了很多开源系统,觉得discourse功能比较完善,灵活.可配置性非常好,部署方便,瀑布流的主题布局模式也很符合未来论坛的趋势,于是在 ucloud 上 ...

  9. iOS -数据库网络之xml解析之第三方解析XML

    1.导入第三方插件(GDalaXMLNode)   2.第三方插件配置   libxml/tree.h 路径   在项目属性中--Bulid Settings中搜索 Search   --Search ...

  10. [转]服务器自动化操作 RunDeck

    From : http://www.oschina.net/p/rundeck/similar_projects?sort=view&lang=25 RunDeck 是用 Java/Grail ...