题解/算法 {C - Avoid K Palindrome 2}

题解/算法 {C - Avoid K Palindrome 2}

@LINK: https://atcoder.jp/contests/abc363/tasks/abc363_c;

这是个标准的算法 即有重复的全排列;

#看一个超时做法#
比如他长度是N, 然后我们弄一个[0,1,2,...,9] 然后执行全排列std::next_permutation 每一次判定Check()是否合法 然后累加答案;
可是他有个问题, 即会遇到重复的排列 你是需要去重的 (比如aab 你会得到aab, aab, aba, aba, baa, baa), 于是就只能再用一个unordered_set< string>去判重;
然而这样的话, 你的时间就是10! = 4e6, 即4e6 * log(4e6)这就超时了;

vector<int> Ind( N);  std::iota( Ind.begin(), Ind.end(), 0);
string T = S;
unordered_set<string> US;
int ANS = 0;
do{
    FOR_( i, 0, N-1){ T[i] = S[ Ind[i]];}
    if( US.find( T) != US.end()){ continue;}
    US.insert( T);

    if( Check()){ ++ ANS;}
}while( std::next_permutation( Ind.begin(), Ind.end()));
cout<< ANS<< "\n";

正确的做法是: 其实你弄一个Ind 再用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值