hdu4763(kmp水题)

原创 2013年12月05日 21:04:55

地址:http://acm.hdu.edu.cn/showproblem.php?pid=4763

Theme Section

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)


Problem Description
It's time for music! A lot of popular musicians are invited to join us in the music festival. Each of them will play one of their representative songs. To make the programs more interesting and challenging, the hosts are going to add some constraints to the rhythm of the songs, i.e., each song is required to have a 'theme section'. The theme section shall be played at the beginning, the middle, and the end of each song. More specifically, given a theme section E, the song will be in the format of 'EAEBE', where section A and section B could have arbitrary number of notes. Note that there are 26 types of notes, denoted by lower case letters 'a' - 'z'.

To get well prepared for the festival, the hosts want to know the maximum possible length of the theme section of each song. Can you help us?
 

Input
The integer N in the first line denotes the total number of songs in the festival. Each of the following N lines consists of one string, indicating the notes of the i-th (1 <= i <= N) song. The length of the string will not exceed 10^6.
 

Output
There will be N lines in the output, where the i-th line denotes the maximum possible length of the theme section of the i-th song.
 

Sample Input
5 xy abc aaa aaaaba aaxoaaaaa
 

Sample Output
0 0 1 1 2
 

题意:找最长相同前后缀,并且字符串中间(不包括前后缀)也要有该子串。

思路:暴力,用kmp稍微剩下时间。

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char s[1000010];
int next[1000010],len;
void getnext()
{
    int i=0,j=-1;
    next[0]=-1;
    while(i<len)  //以前在这里是调用strlen()函数来判断,TLE无数次
    {
        if(j==-1||s[i]==s[j])
        {
            i++;j++;
            next[i]=j;
        }
        else j=next[j];
    }
}
int main()
{
    int t,k,ans;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",s);
        len=strlen(s);
        getnext();
        k=next[len];ans=0;
        while(k&&!ans)
        {
            int g=0;
            for(int i=k;i<len-k;i++)
            {
                if(g==k) break;
                while(!(g==-1||s[i]==s[g]))
                    g=next[g];
                g++;
            }
            if(g==k) ans=k;
            k=next[k];
        }
        printf("%d\n",ans);
    }
    return 0;
}


hdu__KMP算法模板题【持续更新中】

剪花布条                                                                           Time Limit: 1000/1000...
  • ACMore_Xiong
  • ACMore_Xiong
  • 2015年08月22日 12:08
  • 2966

KMP算法的经典例题(poj 3461、poj 2752、poj 2406、poj1961)

传送门:POJ-3461 最简单的KMP题,找出第一个字符串在第二个字符串中出现次数。 #include #include #include #define Memset(x, a) mems...
  • guhaiteng
  • guhaiteng
  • 2016年08月03日 23:48
  • 2794

hdu 1711 KMP算法模板题

题意:给你两个串,问你第二个串是从第一个串的什么位置开始完全匹配的? kmp裸题,复杂度O(n+m)。 当一个字符串以0为起始下标时,next[i]可以描述为"不为自身的最大首尾重复子串长度"。 ...
  • NK_test
  • NK_test
  • 2015年07月22日 23:00
  • 1247

题目推荐—BZOJ 水题推荐

[bzoj1756]Vijos1083小白逛公园 裸题- -。。线段树维护lmax,rmax,max,sum然后搞之。。 [Ahoi2008]Meet 紧急集合 求两两点的lca然后会发现必然有两个l...
  • u011400953
  • u011400953
  • 2013年07月16日 15:26
  • 3141

poj3461~KMP水水水题~

又花了半个小时的时间去
  • a799581229
  • a799581229
  • 2014年08月02日 16:00
  • 193

hdu 2594 扩展KMP模板题

//M hdu2594 扩展KMP 模板题 //题意:给定两个字符串,在第一个字符串中找到一个最大前缀作为第二个字符串的后缀 //思路:将S1作为模式串 然后在s2中寻找,S2作为目标串,用KMP就...
  • yellowjianokok
  • yellowjianokok
  • 2015年09月14日 20:28
  • 342

KMP入门(最详细最好用)

从头到尾彻底理解KMP 作者:July 时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进。 1...
  • u013076044
  • u013076044
  • 2014年12月09日 23:31
  • 1338

KMP算法入门【详解+例题模板】

转载请注明出处:http://blog.csdn.net/a1dark KMP算法的来由就不说了、就个人的理解其实就是预处理要匹配的那个字符串、根据自己身的重复性来找规律节约遍历的时间、说术语就是寻...
  • verticallimit
  • verticallimit
  • 2013年11月13日 19:59
  • 2423

poj_1007 排序水题

code: #include #include using namespace std; void quick_sort(char s[][51],int sort[],int left,...
  • yeruby
  • yeruby
  • 2015年01月27日 11:34
  • 687

啊哈算法DFS应用之水管工游戏

//管子有六个状态,具体见啊哈算法 #include #include #include struct node{ int x; int y; }; struct node st...
  • ccDLlyy
  • ccDLlyy
  • 2016年10月04日 17:28
  • 809
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu4763(kmp水题)
举报原因:
原因补充:

(最多只允许输入30个字)