给定一个字符串,求出一个前缀A,使得字符串的构成可以表示成ABABA的形式(B可以为空串)。

输出这个前缀的最大长度。

KMP算法Next数组的使用。

枚举中间的每个位置,可以根据Next数组求出这个位置对应的前缀。然后暴力判断前缀与后缀是否相等即可。

如图,枚举的位置为 i,则Next[i] = j,。然后判断0~j 是否和 k~len是否是相同的。

注意要判断合法性,即前缀 + 中缀的长度不能比当前枚举的位置大,且后缀开始的位置一定要比当前枚举的位置大。

判定完Next[i]后,一定要判定Next[ Next[i] ],这样递归下去,看看大的如果不符合,小的是否符合。

然而复杂度,我不会证明。

#include <bits/stdc++.h>
using namespace std;
#define maxn 1000010 int Next[maxn]; void GetNext(char s[], int len)
{
Next[] = -;
int j = -;
for (int i = ; i < len; i++)
{
while(j > - && s[j+] != s[i])
j = Next[j];
if (s[j+] == s[i]) j++;
Next[i] = j;
}
} int main()
{
int n;
scanf("%d", &n);
for (int ca = ; ca <= n; ca++)
{
char s[maxn];
scanf("%s", s);
int len = strlen(s), ans = ;
GetNext(s, len);//求出Next数组 for (int i = len-; i >= ; i--)
{
int j = i;
while(j > -)
{
if ((j+)* <= i+ && len - (j+) > i)//判断相互的位置的合法性
{
int flag = ;
for (int k = ; k < j+; k++)
if (s[len - (j+) + k] != s[k])
{
flag = ;
break;
}
if (flag) //前缀和后缀匹配
ans = max(ans, j+);
}
j = Next[j]; //判断比它小的是否符合
}
}
printf("%d\n", ans);
} }

HDU - 4763 Theme Section (KMP的next数组的应用)的更多相关文章

  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. HDU 4763 Theme Section(KMP+枚举公共前后缀)

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

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

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

  5. 2013长春网赛1005 hdu 4763 Theme Section(kmp应用)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4763 题意:给出一个字符串,问能不能在该串的前中后部找到相同的子串,输出最长的字串的长度. 分析:km ...

  6. HDU 4763 Theme Section (2013长春网络赛1005,KMP)

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

  7. HDU 4763 Theme Section

    题目: It's time for music! A lot of popular musicians are invited to join us in the music festival. Ea ...

  8. hdu 4763 Theme Section(next数组找串中三段相等)

    题意:在一个串中找 EAEBE 的形式的最长的E,其中E为一个字符串,也就是说找到前缀与后缀相同,并且串中还存在相同的一段,它们不能重复. 思路:利用next数组,next[len]代表的即是最大的相 ...

  9. CF126B password&&HDU 4763 Theme Section

    http://acm.hdu.edu.cn/showproblem.php?pid=4763 http://codeforces.com/problemset/problem/126/B 这两个题都是 ...

随机推荐

  1. RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例

    你是否听说过或者使用过队列? 你是否听说过或者使用过消息队列? 你是否听说过或者使用过RabbitMQ? 提到这几个词,用过的人,也许觉得很简单,没用过的人,也许觉得很复杂,至少在我没使用消息队列之前 ...

  2. java类在eclipse上打jar包,Linux上成功运行的实例

    1 eclipse下的java项目结构如下图所示: 2 打包的步骤如下: 3 修改minifest.mf文件:  4 .上传需要的三方jar包们和主类打的jar(案例是topV.jar)并且执行jav ...

  3. SyntaxError: Use of const in strict mode.

    具体报错console c:\Users\Administrator\WebstormProjects\blogtest\node_modules\connect-mongo\src\index.js ...

  4. 把一个HashMap的值全部取出来,放到两个数组中

    先是从数据库中获取所有的值,返回一个HashMap类型的数据: <pre name="code" class="java"> private Has ...

  5. BZOJ4299: Codechef FRBSUM(主席树)

    题意 题目链接 数集S的ForbiddenSum定义为无法用S的某个子集(可以为空)的和表示的最小的非负整数. 例如,S={1,1,3,7},则它的子集和中包含0(S’=∅),1(S’={1}),2( ...

  6. Ubuntu获取root 权限,开机自动登入root

    新机器获取root权限,只需要给root 增加密码: sudo passwd root 修改开机自动登入: #sudo gedit /etc/lightdm/lightdm.conf 修改参数: au ...

  7. 初识Adapter

    首先得了解Adapter层级关系: 示例,将user对象适配到textview public class User { private String userName; private String ...

  8. html 之table标签结构学习

    一.HTML table标签结构 html 中table标签的结构情况,如下所示: <!-- table标签结构如下: <table> <thead> # thead表格 ...

  9. JavaScript 的 parseInt 取整

    http://www.neoease.com/javascript-get-integer-via-parseint/ JavaScript 是弱类型语言, 为了保证数值的有效性, 在处理数值的时候, ...

  10. MySQL基础教程——mysql脚本编写

    SQL,结构化查询语言,既是对数据库进行操作的语言,也是数据库脚本文件的扩展名. 要求:新建一个名为 library 的数据库,包含 book.reader 两张表,根据自己的理解安排表的内容并插入数 ...