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

    xiaoxiao2023-03-24  3

    题意:

    给你一个长度不超过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; }

    转载请注明原文地址: https://ju.6miu.com/read-1201951.html
    最新回复(0)