串应用- 计算一个串的最长的真前后缀
Posted 赵玉婷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了串应用- 计算一个串的最长的真前后缀相关的知识,希望对你有一定的参考价值。
题目描述
给定一个串,如ABCDAB,则 ABCDAB的真前缀有:{ A, AB,ABC, ABCD, ABCDA } ABCDAB的真后缀有:{ B, AB,DAB, CDAB, BCDAB } 因此,该串的真前缀和真后缀中最长的相等串为AB,我们称之为该串的“最长的真前后缀”。 试实现一个函数string matched_Prefix_Postfix(string str),得到输入串str的最长的真前后缀。若不存在最长的真前后缀则输出empty
输入
第1行:串的个数 n 第2行到第n+1行:n个字符串
输出
n个最长的真前后缀,若不存在最长的真前后缀则输出empty。
样例输入
6 a ab abc abcd abcda abcdab
样例输出
empty empty empty empty a ab
提示
#include<iostream> #include<string> #include<algorithm> using namespace std; string matched_Prefix_Postfix(string s) { int slength=s.size(); string before[slength-1]; string after[slength-1]; for(int i=0;i<slength-1;i++) { before[i]=s.substr(0,i); } reverse(s.begin(),s.end()); for(int i=0;i<slength-1;i++) { after[i]=s.substr(0,i); reverse(after[i].begin(),after[i].end()); } reverse(s.begin(),s.end()); int Max=0; int index=-1; for(int i=0;i<slength-1;i++) { for(int j=0;j<slength-1;j++) { if(before[i]==after[j]) { int t=after[i].size(); if(t>Max) { index=i; Max=t; } } } } if(Max==0) { string e="empty"; return e; } else { string f=before[index]; return f; } } int main() { int T; cin>>T; while(T--) { string s; cin>>s; cout<<matched_Prefix_Postfix(s)<<endl; } return 0; }
以上是关于串应用- 计算一个串的最长的真前后缀的主要内容,如果未能解决你的问题,请参考以下文章
poj1226-出现或反转后出现在每个串的最长公共子串后缀数组
BZOJ 2946 POI2000 公共串 后缀自动机(多串最长公共子串)