首页 > 其他分享 >Palindrome

Palindrome

时间:2024-07-24 19:40:14浏览次数:6  
标签:Palindrome int 3005 maxn pj solve pi

  • O(n^2)的DP是显然的,但没有优化思路。考虑证伪数据范围。发现n>2600时,根据抽屉原理,一定有一个字符出现了至少101次。
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int f[3005][3005];
int g[3005][3005];
char s[50005];
int cnt[30],pi,pj;
string tmp="";
void solve(int maxn)
{
	string ans1="";
	while(ans1.size()<maxn)
	{
		if(g[pi][pj]==3)
		{
			ans1+=s[pi];
			pi--;
			pj++;
		}
		else if(g[pi][pj]==2)
		{
			pj++;
		}
		else
		{
			pi--;
		}
	}
	string ans2=ans1;
	reverse(ans1.begin(),ans1.end());
	cout<<ans1<<tmp<<ans2<<endl;
}
int main()
{
	string t;
	cin>>t;
	int n=t.size();
	if(n>=2600)
	{
		for(int i=0;i<n;i++)
		{
			cnt[t[i]-'a']++;
			if(cnt[t[i]-'a']>=100)
			{
				for(int j=0;j<100;j++)
				{
					cout<<t[i];
				}
				cout<<endl;
				return 0;
			}
		}
	} 
	for(int i=1;i<=n;i++)
	{
		s[i]=t[i-1];
	}
	pi=0,pj=n+1;
	for(int i=1;i<=n;i++)
	{
		for(int j=n;j>=i+1;j--)
		{
			if(f[i-1][j]>f[i][j+1])
			{
				f[i][j]=f[i-1][j];
				g[i][j]=1;
			}
			else
			{
				f[i][j]=f[i][j+1];
				g[i][j]=2;
			}
			if(s[i]==s[j]&&f[i-1][j+1]+1>f[i][j])
			{
				f[i][j]=f[i-1][j+1]+1;
				g[i][j]=3;
			}
			if(f[i][j]>f[pi][pj]||f[i][j]==f[pi][pj]&&j-i>pj-pi)
			{
				pi=i;
				pj=j; 
			}
			if(f[i][j]==50)
			{
				pi=i;
				pj=j;
				solve(50);
				return 0;
			}
		}
	}
	int maxn=f[pi][pj];
	if(pj!=pi+1)
	{
		tmp+=s[pi+1];
	}
	solve(maxn);
	return 0;
}

标签:Palindrome,int,3005,maxn,pj,solve,pi
From: https://www.cnblogs.com/watersail/p/18321562

相关文章

  • E. No Palindromes
    原题链接题解1.判断整体是不是回文串2.如果是,找第一个与\(s_1\)不同的字符\(s_i\),如果\(s[i+1,n]\)是回文串,代表\(s\)一定长这样\(AbAb....AbA\)3.如果\(A\)的长度为一,或者\(b\)只出现一次,容易想到没有分割方法4.不然可以\(Abaaa...,...aaabAbAbA\)code#inclu......
  • [CF1656G] Cycle Palindrome 的题解
    题目大意给定一个长度为\(n\)的数列\(a\),要求求出一个排列\(p\)满足\(a_{p_1},a_{p_2},\cdots,a_{p_n}\)是一个回文字符串而且把\(i\)向\(p_i\)连边得到的图中只有一个环。数据范围满足,\(1\le\sumn\le2\times10^5\)。思路先不考虑\(p\)是否构成满足要求的环......
  • D - Avoid K Palindrome
    D-AvoidKPalindromehttps://atcoder.jp/contests/abc359/tasks/abc359_d 思路https://atcoder.jp/contests/abc359/submissions/54822869状压DP以K二进制位表示K字符串(由AB组成),判断并记录是否为回文。dp[i][j] --前i个字符,如果以j(k字符状压表示)结尾,是goodstrin......
  • P6754 [BalticOI 2013 Day1] Palindrome-Free Numbers
    数据范围一眼数位dp。关键条件为如果一个数字串的一个长度大于 11 的子串也为回文串的话,那么我们也定义这个数字串为回文串。仔细思考发现一旦两个连续的数相同(偶回文)或两个数隔一个数相同(奇回文)都是回文,所以要保证连续三个数不相同,记录前两位即可。注意事项:1.前导零不应为0......
  • [题解]CF245H Queries for Number of Palindromes
    思路定义\(dp_{i,j}\)表示区间\([i,j]\)中回文串的数量。那么,不难得出状态转移方程\(dp_{i,j}=dp_{i-1}+f_{i,j}\)。(其中\(f_{i,j}\)表示左端点大于等于\(i\),右端点为\(j\)的回文串数量)由此,现在问题转变为了如何求\(f_{i,j}\)。如果我们在求出了\(f_{i+1,j}......
  • [AGC001D] Arrays and Palindrome
    题意有长度为\(n\)的字符串\(S\),与\(a,b\)两个序列。满足\(\suma_i=n,\sumb_i=n\)。若满足\(S\)的以下子段都为回文串:最前面的\(a_1\)个字符,以及紧接着的\(a_2\)个字符...最前面的\(b_1\)个字符,以及紧接着的\(b_2\)个字符...则\(S\)的所有字符......
  • LeetCode 409 Longest Palindrome All In One
    LeetCode409LongestPalindromeAllInOneLeetCode409最长回文算法题解Solutions//MapfunctionlongestPalindrome(s:string):number{constmap=newMap();letlen=0;for(leti=0;i<s.length;i++){if(map.has(s[i])){//配对,消元......
  • ABC 286 C - Rotate and Palindrome
    题目链接:注意到“您可以按任意顺序执行以下两种运算零次或多次”。因此,解决这个问题的一个重要观察点是,你可以假设\(A\)操作执行了几次,然后\(B\)操作执行了几次。你也可以假设\(A\)操作最多被执行\(N\)次(因为执行\(N\)次就会使它处于原始状态)有了这个观察结果,你就......
  • CF1951E No Palindromes 题解
    题目大意给出一个字符串sss,要求将sss分为若干个非回文子串,输出......
  • SP2426 PLD - Palindromes 题解
    题目传送门题目大意给定一个字符串,请你求出这个字符串中所有长度为kkk的回文串的个数。解题思路我们只需要枚举每个字串的起始位置......