牛客 衔尾蛇
作者:互联网
题目链接: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