您的位置:首页 > 其它

UVALive 6659 Dromicpalin Substrings (递推 + 暴力枚举)

2016-09-28 00:02 519 查看
题意:

给你一个长度不超过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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: