P1691 有重複元素的排列問題 (模擬全排列)
阿新 • • 發佈:2018-12-11
題目描述
設R={r1,r2,……,rn}是要進行排列的n個元素。其中元素r1,r2,……,rn可能相同。使設計一個演算法,列出R的所有不同排列。
給定n以及待排列的n個元素。計算出這n個元素的所有不同排列。
輸入輸出格式
輸入格式:
第1行:元素個數n(1<=n<500)
第2行:一行字串,待排列的n個元素
輸出格式:
計算出的n個元素的所有不同排列,最後一行是排列總數。
輸入輸出樣例
輸入樣例#1: 複製
4 aacc
輸出樣例#1: 複製
aacc acac acca caac caca ccaa 6
說明
輸出按字典順序排
如果按字母挨個搜尋,45分,直接T,舒服. 然後直接用next 直接過,你就在想,為啥next能過,因為next是按字母出現的次數搜尋的啊! 記得用陣列記錄出現的次數來迴圈,不要用map! map會很慢!因為ma是樹
//神獸勿刪 // ━━━━━━神獸出沒━━━━━━ // ┏┓ ┏┓ // ┏┛┻━━┛┻┓ // ┃ ┃ // ┃ ━ ┃ // ┃┳┛┗┳ ┃ // ┃ ┃ // ┃ ┻ ┃ // ┃ ┃ // ┗━┓ ┏┛ Code is far away from bug with the animal protecting // ┃ ┃ 神獸保佑,程式碼無bug // ┃ ┃ // ┃ ┗━━━┓ // ┃ ┣┓ // ┃ ┏┛ // ┗┓┓┏━┳┓┏┛ // ┃┫┫ ┃┫┫ // ┗┻┛ ┗┻┛ // // ━━━━━━感覺萌萌噠━━━━━━ // ┏┓ ┏┓ // ┏┛┻━━┛┻┓ // ┃ ┃ // ┃ ━ ┃ // ┃ > < ┃ // ┃ ┃ // ┃... ⌒ ... ┃ // ┃ ┃ // ┗━┓ ┏┛ // ┃ ┃ Code is far away from bug with the animal protecting // ┃ ┃ 神獸保佑,程式碼無bug // ┃ ┃ // ┃ ┃ // ┃ ┃ // ┃ ┃ // ┃ ┗━━━┓ // ┃ ┣┓ // ┃ ┏┛ // ┗┓┓┏━┳┓┏┛ // ┃┫┫ ┃┫┫ // ┗┻┛ ┗┻┛ #include<bits/stdc++.h> //#include <iostream> //#pragma GCC optimize(2) using namespace std; #define maxn 505 #define inf 1e18 typedef long long ll; const ll mod = 1e9+7; ll n,ans,arr[maxn]; char str[maxn],temp[maxn]; void dfs(ll num,ll k) { if(num == n) { ans++; for(ll i = 0; i < n; i++) cout << temp[i]; cout << endl; } else { for(ll i = 0; i < 26; i++) { if(arr[i]!=0) { temp[k] = 'a' + i; arr[i]--; dfs(num+1,k+1); arr[i]++; } } } return ; } int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin >> n; cin >> str; for(ll i = 0; i < n; i++) arr[ str[i]-'a' ] ++; dfs(0,0); cout << ans << endl; return 0; }