题意:
给你一个长度不超过1000的字符串,对于任意一个子字符串,你可以任意排列,问有多少个子字符串能排成回文串?
思路:
先递推预处理出 i到j区间内 有多少个 奇数个的字母,然后暴力枚举 子字符串,判断这个区间奇数个数,如果大于1 不合适 否则ans++
输出ans即可!
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; char s[1007]; int vis[30]; int g[1007][1007]; int main(){ int T,kase = 0; scanf("%d",&T); while(T--){ scanf("%s",s+1); int len = strlen(s+1); memset(g,0,sizeof g); for (int i = 1; i <= len; ++i){ memset(vis,0,sizeof vis); for (int j = i; j >= 1; --j){ int id = s[j] - 'a'; vis[id]++; if (i == j)g[j][i] = 0; else g[j][i] = g[j+1][i]; if (vis[id] & 1)g[j][i]++; else g[j][i]--; } } int ans = 0; for (int i = 1; i <= len; ++i){ for (int j = i; j <= len; ++j){ if (g[i][j] > 1)continue; ++ans; } } printf("Case %d: %d\n",++kase,ans); } return 0; }