7-22 最长公共前后缀 (25分)

字符串的前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串;后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串。例如对于字符串 abacaba,其前缀有 a, ab, aba, abac, abacab,后缀有bacaba, acaba, caba, aba, ba, a。最长公共前后缀就是 aba。现给出一个长度为 N 的字符串 S,对于每个 M (0<=M<N),求出连续子串 S[0…M] 的最长公共前后缀。

输入格式:

输入数据仅有一行,包含一个长度不超过 100,000 的仅由字母 a-z 构成的字符串。

输出格式:

对于每个 M (0,1,2,…,N−1),输出对应的最长公共前后缀长度,以空格分隔,且行尾不得有多余空格。

输入样例:

abcdabcdabce

输出样例:

0 0 0 0 1 2 3 4 5 6 7 0

源码:

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#define Max 100010
using namespace std;
char t[Max];
int len[Max];
int main()
{
	scanf("%s",t);
	int i;
	int max_len=0;
    len[0]=0;
    int l=strlen(t);
	for(i=1;i<l;i++)
	{
		while(1)
		{
			if(t[max_len]==t[i]||max_len<=0)
			break;
			max_len=len[max_len-1];
		}
		if(t[max_len]!=t[i])
		{
			len[i]=0;
		}
		else
		{
			len[i]=++max_len;
		}
	}
	
	for(i=0;i<l;i++)
	{
		if(!i)
		printf("%d",len[i]);
		else
		printf(" %d",len[i]);
	}
}
发布了83 篇原创文章 · 获赞 12 · 访问量 1939
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 黑客帝国 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览