其他分享
首页 > 其他分享> > 牛客 衔尾蛇

牛客 衔尾蛇

作者:互联网

题目链接:https://ac.nowcoder.com/acm/contest/9854/D

思路:通过枚举多少个不同的蛇 来得到其全排列 用字典序最小的字符串代表一个环形的字符串

然后用set来去重 如 aabb 等价于baab bbaa abba 但取aabb(字典序最小) 来表示这种环

注意next_permutation 函数 只会跑实际有的全排列的次数  如111122223333 只会跑12!/(4!*4!*4!) 而不是12!次

rotate 是把前面i个数不改变相对顺序放在后面  如 123456 放2个数的话即 345612

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define pb push_back
 4 using namespace std;
 5 const int maxn=2e5+10;
 6 const int mod=1e9+7;
 7 
 8 int solve(int a,int b,int c)
 9 {
10     string s=string(a,'a')+string(b,'b')+string(c,'c');
11     set<string>S;
12     do
13     {
14         string t1=s,t2=s;
15         int n=s.size();
16         for(int i=1;i<=n;i++)
17         {
18             rotate(t2.begin(),t2.begin()+1,t2.end());
19             t1=min(t1,t2);
20         }
21         S.insert(t1);
22     }
23     while(next_permutation(s.begin(),s.end()));
24     return S.size();
25 }
26 
27 
28 
29 int main()
30 {
31     ios::sync_with_stdio(0);
32     cin.tie(0);
33     int a,b,c;
34     cin>>a>>b>>c;
35     int ans=0;
36     for(int i=0;i<=a;i++)
37         for(int j=0;j<=b;j++)
38             for(int k=0;k<=c;k++)
39                 if(i+j+k)ans+=solve(i,j,k);
40     cout<<ans<<'\n';
41 
42 
43 
44 }
View Code

 

标签:衔尾,12,const,string,int,long,牛客,define
来源: https://www.cnblogs.com/winfor/p/14225891.html