大江东去,浪淘尽,千古风流人物。故垒西边,人道是,三国周郎赤壁。乱石穿空,惊涛拍岸,卷起千堆雪。江山如画,一时多少豪杰。遥想公瑾当年,小乔初嫁了,雄姿英发。羽扇纶巾,谈笑间,樯橹灰飞烟灭。故国神游,多情应笑我,早生华发。人生如梦,一尊还酹江月。

题解 AT1877 【回文分割】

题意:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。 返回 s 所有可能的分割方案。

示例:

输入:aab

输出:3

解释:aba

思路:

记录字符串中每个字符出现的次数si

如果si为偶数,那么这些字符i就可以和别的回文串拼在一起变成更长的回文串

如果si为奇数,那就必须从i中拿一个出来作为某个回文串的中间字符

容易发现,si中有多少个为奇数,最少就可以分成几个串

知道最少可以分成几个串以后枚举长度即可

可得以下AC代码:

#include<bits/stdc++.h>
using namespace std;
int a[30],p,i;
int main(){
    string s;
    cin>>s;//输入
    int l=s.size();//求串长
    for(i=0;i<l;i++)a[s[i]-'a']++;//拼起来
    for(i=0;i<26;i++)p+=a[i]%2;
    if(!p){//特判p=0
        cout<<l;
        return 0;//退出很重要,否则会输出其他东西
    }
    for(i=1;p*i<=l;i+=2);//枚举长度
    cout<<i-2;//输出
    return 0;//好习惯
}
posted @ 2019-05-28 12:56  jbc666  阅读(149)  评论(0编辑  收藏  举报