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


Theme Section

Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 271Accepted Submission(s): 121


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

Source
2013 ACM/ICPC Asia Regional Changchun Online

Recommend
liuyiding

就是要中间找一段最长的和,和开头和结尾一样。

KMP就解决了。

有点暴力。

先next[n]一直标记下。

然后循环找next,更新答案

 1 /* ***********************************************
 2 Author        :kuangbin
 3 Created Time  :2013-9-29 18:18:34
 4 File Name     :E:\2013ACM练习\2013网络赛\2013长春网络赛\1005.cpp
 5 ************************************************ */
 6 
 7 #include <stdio.h>
 8 #include <string.h>
 9 #include <iostream>
10 #include <algorithm>
11 #include <vector>
12 #include <queue>
13 #include <set>
14 #include <map>
15 #include <string>
16 #include <math.h>
17 #include <stdlib.h>
18 #include <time.h>
19 using namespace std;
20 
21 void kmp_pre(char x[],int m,int next[])
22 {
23     int i,j;
24     j = next[0] = -1;
25     i = 0;
26     while(i < m)
27     {
28         while( -1 != j && x[i] != x[j] )j = next[j];
29         next[++i] = ++j;
30     }
31 }
32 char str[1000010];
33 int next[1000010];
34 bool f[1000010];
35 int main()
36 {
37     //freopen("in.txt","r",stdin);
38     //freopen("out.txt","w",stdout);
39     int T;
40     scanf("%d",&T);
41     while(T--)
42     {
43         scanf("%s",str);
44         int n = strlen(str);
45         kmp_pre(str,n,next);
46         memset(f,false,sizeof(f));
47         int tmp = n;
48         while(tmp > 0)
49         {
50             if(n >= 2*tmp)f[tmp] = true;
51             tmp = next[tmp];
52         }
53         int ans = 0;
54         for(int i = n-1;i > 1;i--)
55         {
56             tmp = i;
57             while(tmp > 0)
58             {
59                 if(f[tmp] && i >= 2*tmp && n >= i+tmp)
60                 {
61                     ans = max(ans,tmp);
62                     break;
63                 }
64                 tmp = next[tmp];
65             }
66         }
67         printf("%d\n",ans);
68     }
69     return 0;
70 }

优质内容筛选与推荐>>
1、为全站网页添加全局“变量”
2、php 正则匹配中文
3、python_部分中文显示正常部分乱码
4、遍历类的所有属性和根据属性名动态设置属性值
5、Java集合中Collections工具类总结


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn