牛客 小A的回文串(最长回文子串,3种写法)

题目链接:https://ac.nowcoder.com/acm/contest/549/B?&headNav=acm

1.中间枚举(向两边扩展)

2.dp(最外层枚举长度,dp[i][j],i到j区间内的最优解)

3.Manacher算法 参考链接(https://www.cnblogs.com/z360/p/6375514.html)

附上三个代码:

#include 
#define LL long long
using namespace std;
string s;
int main()
{
    string t;
    cin>>t;
    s=t+t;
    int len=s.length();
    int maxi=1;
    for(int i=0;i=0&&s[u]==s[mid])
        {
            u--;
            tem=2;
        }
        else if(v=0&&v
#include 
#define LL long long
using namespace std;
const int maxn=10001;
bool dp[maxn][maxn];
string s;
void init()
{
    memset(dp,false,sizeof(dp));
    for(int i=0;i>t;
    s=t+t;
    int len=s.length();
    init();
    int maxi=1;
    for(int k=2;k<=len/2;k++)
    {
        for(int u=0;u+k-1
#include

using namespace std;
const int maxn=5005;
string tt;
int Len[maxn*2];
int main()
{
	cin>>tt;
	int len=tt.length();
	int ans=0;
	for(int u=0;ui) 
				Len[i]=min(mx-i,Len[po-(i-po)]);
			else
				Len[i]=1;
			while(z[i-Len[i]]==z[i+Len[i]])
				Len[i]++;
			if(Len[i]+i>mx)
			{
				mx=Len[i]+i;
				po=i;
			}
			maxi=max(maxi,Len[i]);
		}
		ans=max(ans,maxi-1);
	}
	cout << ans << endl;
	return 0;
}

 

你可能感兴趣的:(acm)