Concise and clear CodeForces - 991F(dfs 有重复元素的全排列)
就是有重复元素的全排列
#include <bits/stdc++.h>
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long LL;
const int maxn = , INF = 0x7fffffff;
char str[maxn];
int vis[maxn], v[maxn];
LL num[maxn];
LL res = ;
void init()
{
num[] = ;
for(int i=; i<maxn; i++)
num[i] = num[i-] * i;
}
void dfs(LL x, LL cnt)
{
if(cnt == )
{
if(x > ) return;
LL ans1 = , ans2 = , ans3 = ;
for(int i=; i<=; i++)
{
ans2 += v[i];
}
LL temp = ans2;
ans2 = num[ans2];
for(int i=; i<=; i++)
ans2 /= num[v[i]];
// cout<< ans2 <<endl;
if(v[])
{
ans3 = num[temp-];
for(int i=; i<=; i++)
if(i == ) ans3 /= num[v[i]-];
else ans3 /= num[v[i]]; ans2 -= ans3;
} res += ans2;
return;
}
if(!vis[cnt])
dfs(x, cnt+);
else
for(int i=; i<vis[cnt] && i<=x; i++)
{
v[cnt] += i;
dfs(x-i, cnt+);
v[cnt] -= i;
}
}
int main()
{
init();
cin>> str;
int len = strlen(str);
int maxx = -INF;
LL sum = , ans = , flag = ;
for(int i=; i<len; i++)
{
if(i != )
if(str[i] != str[i-])
flag = ;
vis[str[i]-'']++;
if(vis[str[i]-''] == ) ans++;
}
if(!flag)
{
cout<< len <<endl;
return ;
}
res += num[ans];
if(vis[])
res -= num[ans-];
for(int i=; i<=; i++)
if(vis[i])
sum += vis[i]-;
for(int i=; i<=sum; i++)
{
for(int i=; i<=; i++)
if(vis[i])
v[i] = ;
else
v[i] = ;
dfs(i, ); }
cout<< res <<endl; return ;
}
Concise and clear CodeForces - 991F(dfs 有重复元素的全排列)的更多相关文章
- 紫书 习题 10-25 UVa 1575 (有重复元素的全排列+暴搜)
我一开始以为有什么很牛逼的方法来做,然后一直没有思路 后来看了https://blog.csdn.net/zju2016/article/details/78562932的博客 竟然是暴搜?????? ...
- 【模板】 全排列 && 有重复元素的全排列
全排列 #include<bits/stdc++.h> using namespace std; ]; void print (int n){ ;i<=n;i++) cout< ...
- poj3421 X-factor Chains(重复元素的全排列)
poj3421 X-factor Chains 题意:给定正整数$x(x<=2^{20})$,求$x$的因子组成的满足任意前一项都能整除后一项的序列的最大长度,以及满足最大长度的子序列的个数. ...
- 剑指 Offer 38. 字符串的排列 + 无重复元素的全排列
剑指 Offer 38. 字符串的排列 Offer_38 题目描述 解题思路 可以使用递归实现全排列,每次都确定一个数的位置,当所有位置的数都确定后即表示一个排列. 但是考虑到本题需要排除重复的排列, ...
- 刷题——有重复元素的全排列(Permutations II)
题目如上所示. 我的解决方法(参考了九章的答案!): class Solution { public: /* * @param : A list of integers * @return: A li ...
- dfs 全排列 使用交换——含重复元素和非重复元素
15. 全排列 中文 English 给定一个数字列表,返回其所有可能的排列. 样例 样例 1: 输入:[1] 输出: [ [1] ] 样例 2: 输入:[1,2,3] 输出: [ [1,2,3], ...
- CodeForces 877E DFS序+线段树
CodeForces 877E DFS序+线段树 题意 就是树上有n个点,然后每个点都有一盏灯,给出初始的状态,1表示亮,0表示不亮,然后有两种操作,第一种是get x,表示你需要输出x的子树和x本身 ...
- dfs 排列组合——找所有子集(重复元素和不重复元素)
17. 子集 中文 English 给定一个含不同整数的集合,返回其所有的子集. 样例 样例 1: 输入:[0] 输出: [ [], [0] ] 样例 2: 输入:[1,2,3] 输出: [ [3], ...
- arrayList的合并以及删除重复元素
arrayList的合并: package listTest;//arrayList的合并 import java.util.ArrayList; public class arrayListTest ...
随机推荐
- Python构建web应用(进阶版)->对网页HTML优化逻辑显示
本篇是承接上一篇web应用(入门级)的内容往下顺延的,阅读后将会了解HTML逻辑显示优化,如下图所示,从杂乱无章的日志文件到一个整齐的列表显示. —————————————————————————— ...
- [Unity3D]MonoDeveloper快捷键(补全代码补全引用中文乱码tab转空格)
Hello亲爱的观众朋友们大家好,我是09. vs支持各种插件,一般推荐用vs.不过总有人(例如我)由于各种原因用MonoDeveloper.苦于每次上网找各种设置,此处集中写下我用MonoDevel ...
- 六大iT公司的组织结构
- Codeforces Round #524 (Div. 2) C. Masha and two friends(矩形相交)
C. Masha and two friends time limit per test 1 second memory limit per test 256 megabytes input stan ...
- JavaWeb-Servlet-Tomcat
Servlet就是运行在服务器上的Java类.Servlet容器为javaweb应用提供运行时环境,负责管理Servlet和JSP的生命周期,以及管理它们的共享数据. Servlet容器软件——Tom ...
- linux压缩相关
tar命令 tar是打包,即把好多东西放在一个大文件里面,之后再压缩:当然也可以解包 tar的几个参数说明: -c 创建一个新的包 -x 将包里的文件还原出来 -t 显示包内文件的列表 -f 指定要处 ...
- Vue 列表渲染及条件渲染实战
条件渲染 有时候我们要根据数据的情况,决定标签是否进行显示或者有其他动作.最常见的就是,表格渲染的时候,如果表格没有数据,就显示无数据.如果有数据就显示表格数据. Vue 帮我们提供了一个v-if的指 ...
- DB2分页查询简单示例
select * from ( select a.* ,rownumber() over(order by create_time desc) as rowid from ( select * fro ...
- spring boot的maven项目报404错误
$.ajax({ async: false, type: "POST", url:'searchFileSource', contentType : "applicati ...
- 团队C++作业1
我的分工 在本次作业中,我负责的是建筑类的完成还有调试运行. 建筑类的完成: 首先我认为建筑类的完成中,建筑类中应该有三个成员,水晶,防御塔,泉水. 水晶在这个里头是要被保护的对象,它的功能有回血还有 ...