【HDOJ 4763】 Theme Section (KMP+strstr)

【HDOJ 4763】 Theme Section

Theme Section

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

Total Submission(s): 1999    Accepted Submission(s): 947

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的前缀方法(从当前字符的next数组指向的位置往前到母串首 和 从当前字符向前相同长度的串是相同串)

三串不好想 如果两串呢

首尾找最长相同两串我的思路是找出最后一个字母不断next过程中经过的下标 下标>母串长len/2 的话肯定不行 <len/2 的最大的就是所求长度(一定满足 因为是从母串中心分开的 必定不重叠

三串可以用同样思路 找小于len/3的 这样前后都满足了相同且不重叠 但中间串呢 上STL吧……或者用自己做好的KMP也行 图省事。。只要找到当前坐标往前的串在当前坐标往后的串中第一次出现的位置 看是否在当前坐标x*2~len-x之间即可

代码如下:

#include <bits/stdc++.h>

using namespace std;

char str[1111111];
int Next[1111111];

void GetNext()
{
	Next[0] = -1;
	int k,len;
	len = strlen(str);
	for(int i = 1; i < len; ++i)
	{
		k = Next[i-1];
		while(k != -1 && str[k+1] != str[i]) k = Next[k];

		if(k == -1 && str[0] != str[i]) Next[i] = -1;
		else if(k == -1 && str[0] == str[i]) Next[i] = 0;
		else Next[i] = k+1;
	}
}

int num[1111111],tp;

int main()
{

	int n,m,t,i,j,u,v,w,len,k,mm,mlen,l,r;
	int pos;

	scanf("%d",&t);
	while(t--)
	{
		scanf("%s",str);
		GetNext();
		len = strlen(str);
		tp = 0;
		num[tp++] = len;
		k = Next[len-1];
		while(k != -1)
		{
			num[tp++] = k+1;
			k = Next[k];
		}
		sort(num,num+tp);

		mm = -1;
		for(i = 0; num[i] <= len/3; ++i)
		{
			if(mm == -1 || num[mm] < num[i]) mm = i;
		}

		while(mm != -1)
		{
			l = strstr(str+num[mm],str+len-num[mm])-str;
			if(l >= num[mm] && l+num[mm] <= len-num[mm]) break;
			--mm;
		}

		if(mm == -1) puts("0");
		else printf("%d\n",num[mm]);
	}

    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 04:39:51

【HDOJ 4763】 Theme Section (KMP+strstr)的相关文章

【HDU 4763】Theme Section(KMP)

这题数据水的一B,直接暴力都可以过. 比赛的时候暴力过的,回头按照正法做了一发. 匹配的时候 失配函数 其实就是前缀 后缀的匹配长度,之后就是乱搞了. KMP的题可能不会很直接的出,但是KMP的思想经常渗透在很多题目里面,最近需要多练习一下. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 1000005; int _next[max

【HDOJ 4768】 Flyer (等差数列+二分)

[HDOJ 4768] Flyer (等差数列+二分) Flyer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2022    Accepted Submission(s): 743 Problem Description The new semester begins! Different kinds of student soc

【HDOJ 5379】 Mahjong tree

[HDOJ 5379] Mahjong tree 往一颗树上标号 要求同一父亲节点的节点们标号连续 同一子树的节点们标号连续 问一共有几种标法 画了一画 发现标号有二叉树的感觉 初始标号1~n 根结点1可以标1或n 否则其他情况无法让下面的子树满足各自连续并且该根的儿子节点都要连续 根结点下的节点平分其他标号 画一画可以发现 每个根下最多有两颗子树 否则无法满足条件 并且两颗子树占据剩余标号的左右两边 中间夹的必须是叶子 这样才能满足该根下的儿子节点标号连续 若根下只有一颗子树 同样可以选择占剩

【HDOJ 5384】Danganronpa

[HDOJ 5384]Danganronpa AC自动机...当时感觉用字典树 标神也往自动机想来着..手太生加上时间紧迫也没敲--回来一看题解什么AB同时建自动机...顿时愣了 什么叫同时建= =问了问财神说普通自动机...B串单建 立马疯了--这不就是模板题么... B串建自动机 A串枚举查询 写完兴冲冲1T--立马想法优化 建fail时压缩一下 查询时直接累计 不再循环找fail 171ms...第二个自动机的题..距上次蛮久了 这次一复习 感觉印象差不多有了 代码(模板)如下: #inc

【HDOJ 5834】Magic boy Bi Luo with his excited tree(树型DP)

[HDOJ 5834]Magic boy Bi Luo with his excited tree(树型DP) Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description Bi Luo is a magic boy, he also has a migic tree,

【HDOJ 4686】 Arc of Dream (矩阵快速幂)

[HDOJ 4686] Arc of Dream (矩阵快速幂) 两个公式 a(i) = a(i-1)*Ax+Ay b(i) = b(i-1)*Bx+By 求 0~(n-1) 的a(i)*b(i) 初始矩阵为                                       求幂矩阵为 a0                                                      Ax          0           0          0        

【HDOJ 1005】 CRB and His Birthday

[HDOJ 1005] CRB and His Birthday 背包 商场卖东西 没件物品有对应的价值 同时由于超市老板跟你是好绩优...每买一件物品给你a个糖果 同时如果购买某物品 会给对应的b种糖果 即买x个i 可以得到ai*x+bi个糖果 问怎么能得到最多糖果 开始是想开个bool标记每个状态某糖果买每买 还有在该状态是否第一次买某种糖果 写着写着写不好了-- 后来突然想到 可以把每件物品拆开 由于每种物品只赠送一次b 可以把赠b的物品作为"特卖品" 其余为正常送a的物品 这样

【HDOJ 4970】 Killing Monsters

[HDOJ 4970] Killing Monsters 数据很大 立马想预处理 每只怪物会从点x出现移动到点n(终点) 问能剩几只怪物 预处理求出每个位置到终点所受伤害 出现一只怪物直接判断死活即可 代码如下: #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <algorithm> #include <queue>

【HDOJ 5654】 xiaoxin and his watermelon candy(离线+树状数组)

pid=5654">[HDOJ 5654] xiaoxin and his watermelon candy(离线+树状数组) xiaoxin and his watermelon candy Time Limit: 4000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 233    Accepted Submission(s): 61 Problem Des