题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4763

题意:给出一个字符串,问能不能在该串的前中后部找到相同的子串,输出最长的字串的长度。

分析:kmp的next[]数组应用。

next[i]=k表示在位置i之前有k个字符与字符串前k个字符相同,利用这个性质,先求出next[]数组,注意next[len]也要求出来,next[i]就表示字符串的后部与前部相同的长度,这样就只需找有没有中部就可以了。在next[i]到len-next[i]之间找有没有和next[i]相同的值就行了,找到就表示有中部,否则没有,这时i=next[i],然后继续找有没有中部,一直到next[i]==0为止。

之前的做法是错的,因为题目要求前缀,中缀,后缀不能出现重叠,之前的做法会导致3个错误:

1.可能会导致求出来的前缀和中缀重叠导致错误;

2.在next[i]到len-next[i]中间可能出现长度与前缀相同但是字符不一样的字串,比如:aaaaabbbbaaaa,这样用之前的做法会得出错误的答案;

3.如果前缀和中缀是连续的,那么next[len]就有可能是前缀和中缀的总长度和了,这样也会错误。

所以不能仅仅依靠next[]数组来求解

正确的做法是:

在next[i]到len-next[i]之间用kmp匹配前缀,如果匹配成功,则说明能找到中部,否则不能,i=next[i]然后继续查找中部,直到next[i]==0即可.

根据next[]数组的性质,循环的次数不超过3次,因为如果后部和前部不相同的话,next[i]==0,这样很快就可以跳出循环了。

还可以加个优化:前中后部字串的长度最多为len/3,如果next[i]>len/3的话就可以直接跳过查找中部,进入下一次循环了。但是优化不大,因为循环次数非常少。

AC代码:

 #include<cstdio>
#include<cstring>
const int N=+;
int next[N];
char s[N],c[N],d[N];
void get_next(char s[])
{
int len=strlen(s);
int i=;
int j=-;
next[]=-;
while(i<=len) //注意要==
{
if(j==-||s[i]==s[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
int kmp(char t[],char s[])
{
int i,j,k,m,n;
m=strlen(s);
n=strlen(t);
i=j=k=;
while(i<m&&j<n)
{
if(j==- || t[j]==s[i])
{
i++;
j++;
}
else
j=next[j];
}
if(j>=n)
return ;
else
return ;
}
int main()
{
int t,j,k;
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
get_next(s);
int len=strlen(s);
int i=next[len];
int flag=;
while(i>)
{
while(i>len/)
i=next[i];
if(i<=)
break;
/********************************
错误解法:
for(j=i;j<=len-i;j++) //找中部
if(next[j]==i)
{
flag=1;
break;
}
********************************/
for(k=,j=;j<i;j++)
c[k++]=s[j];
c[k]='\0';
for(k=;j<len-i;j++)
d[k++]=s[j];
d[k]='\0';
flag=kmp(c,d);
if(flag==) //找到了
break;
else
i=next[i]; //找不到,循环继续
}
if(flag)
printf("%d\n",i);
else
printf("0\n");
}
return ;
}

2013长春网赛1005 hdu 4763 Theme Section(kmp应用)的更多相关文章

  1. hdu 4763 Theme Section(KMP水题)

    Theme Section Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  2. HDU 4763 Theme Section(KMP灵活应用)

    Theme Section Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  3. 2013长春网赛1009 hdu 4767 Bell(矩阵快速幂+中国剩余定理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4767 题意:求集合{1, 2, 3, ..., n}有多少种划分情况bell[n],最后结果bell[ ...

  4. 2013长春网赛1001 hdu 4759 Poker Shuffle

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4759 题意:有一堆2^n的牌,牌原先按(1,2,....k)排序,每一次洗牌都将牌分成两种情况:(1, ...

  5. 2013长春网赛1004 hdu 4762 Cut the Cake

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4762 题意:有个蛋糕,切成m块,将n个草莓放在上面,问所有的草莓放在同一块蛋糕上面的概率是多少.2 & ...

  6. 2013长春网赛1010 hdu 4768 Flyer

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4768 题意:有n个社团发传单,每个社团发给编号为A_i, A_i+C_i,A_i+2*C_i,…A_i ...

  7. 2013长春网赛 1006 hdu 4764 Stone(巴什博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4764 题意:Tang 和 Jiang 玩一个游戏,轮流写下一个数,Tang先手,第一次Tang只能写[ ...

  8. HDU 4763 Theme Section(KMP+枚举公共前后缀)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4763 题目大意: 给你一个字符串s,存在一个子串E同时出现在前缀.中间.后缀,即EAEBE这种模式,A ...

  9. HDU 4763 Theme Section ( KMP next函数应用 )

    设串为str, 串长为len. 对整个串求一遍next函数,从串结尾开始顺着next函数往前找<=len/3的最长串,假设串长为ans,由于next的性质,所以找到的串肯定满足E……E这种形式, ...

随机推荐

  1. Python3使用tkinter编写GUI程序

    目录 @(Python3中tkinter写的HTTP测试工具代码支持正则表达式和XPATH) 程序非常简单,暂时只支持GET方法,使用内置库tkinter编写GUI窗口,在Mac下运行效果图如下,wi ...

  2. JAVA框架 Mybaits 核心配置

    一:mybaits的核心配置文件:SqlMapConfig.xml 配置文件中需要关注的属性: 二.properites属性:一般引用配置文件(properites文件)比如:数据库的配置.我们可以编 ...

  3. opencv 显示摄像头数据

    本文章是一个小例子,主要是在ubuntu 系统中利用Opencv 显示摄像头的数据 ,显示到对话框中. 1.建立一个  main.cpp #include<opencv2/core/core.h ...

  4. Hadoop体系结构杂谈

    hadoop体系结构杂谈 今天跟一个朋友在讨论hadoop体系架构,从当下流行的Hadoop+HDFS+MapReduce+Hbase+Pig+Hive+Spark+Storm开始一直讲到HDFS的底 ...

  5. 20155304《网络对抗》Exp8 Web基础

    20155304<网络对抗>Exp8 Web基础 实践要求 (1).Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的H ...

  6. 20155334 《网络攻防》Exp4 恶意代码分析

    <网络攻防>Exp4 恶意代码分析 一.实验问题回答 如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来监 ...

  7. mfc 动态为控件添加事件1

    知识点: 认识窗口过程 GetWindowLong SetWindowLong 为动态控件绑定事件 一.获取窗口过程 二.设置新窗口过程 .书写一个新窗口过程函数 窗口过程格式 LRESULT CAL ...

  8. mfc 类三种继承方式下的访问

    知识点 public private protected 三种继承方式 三种继承方式的区别 public 关键字意味着在其后声明的所有成员及对象都可以访问. private 关键字意味着除了该类型的创 ...

  9. HNOI2019 摸鱼记

    感觉准备省选时有点浮躁,没有准备联赛时那样认真, 希望能将这次省选当做一个教训吧QAQ. Day -inf 基本上把要学的东西都学了,至少做到了自己心里有底. Day 0 乒乓球室没开差评,打隔膜不带 ...

  10. C语言学习之联合类型

    前言 联合(union)是一种特殊的数据类型,和结构体很像,结构体各成员变量有自己独立的存储位置,而联合的成员变量共享同一片存储区域,因此联合变量再一个时刻只能保存它的某一个成员的值. 联合的定义和初 ...