标签:子串 le int characteristics 枚举 cf835 长度 dp 回文
题意:
求原字符串s中 k阶回文串 的个数,k取遍1到|s|
k阶回文串:左半子串与右半子串相同,且左右两半都是非空 k-1 阶回文串
\(|s|\le 5000\)
思路:
\(f(l,r)\) 表示子串 \([l,r]\) 的回文阶数。初始:所有长度为1的子串都是1阶的。
从 \(f(l+1,r-1)\) 推到 \(f(l,r)\):若 \(s_l\neq s_r\) ,或 \(f(l+1,r-1)=0(l+1\le r-1)\) ,则 \(f(l,r)=0\);否则 \(f(l,r)=f(l+1,r-1)+1\)
枚举长度,然后枚举起点,\(O(n^2)\)
注意 k+1阶回文串必定也是 k阶回文串
const int N = 5005;
char s[N];
int n, f[N][N], ans[N];
signed main()
{
scanf("%s", s + 1); n = strlen(s + 1);
for(int i = 1; i <= n; i++) f[i][i] = 1, ans[1]++;
for(int len = 2; len <= n; len++)
{
for(int l = 1; l + len - 1 <= n; l++)
{
int r = l + len - 1;
if(s[l] != s[r] || l+1<=r-1 && !f[l+1][r-1]) f[l][r] = 0;
else f[l][r] = f[l][l + len/2 - 1] + 1;
ans[f[l][r]]++; //统计答案
}
}
for(int i = n - 1; i; i--) ans[i] += ans[i+1]; //注意
for(int i = 1; i <= n; i++) printf("%d ", ans[i]);
}
标签:子串,le,int,characteristics,枚举,cf835,长度,dp,回文 来源: https://www.cnblogs.com/wushansinger/p/15875950.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。