CSU 1563 Lexicography (搜尋+組合數)
1563: Lexicography
Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 469 Solved: 150Description
An anagram of a string is any string that can be formed using the same letters as the original. (We consider the original string an anagram of itself as well.) For example, the string ACM has the following 6 anagrams, as given in alphabetical order:
ACM
AMC
CAM
CMA
MAC
MCA
As another example, the string ICPC has the following 12 anagrams (in alphabetical order):
CCIP
CCPI
CICP
CIPC
CPCI
CPIC
ICCP
ICPC
IPCC
PCCI
PCIC
PICC
Given a string and a rank K, you are to determine the Kth such anagram according to alphabetical order.
Input
Each test case will be designated on a single line containing the original word followed by the desired rank K. Words will use uppercase letters (i.e., A through Z) and will have length at most 16. The value of K will be in the range from 1 to the number of distinct anagrams of the given word. A line of the form "# 0" designates the end of the input.
Output
For each test, display the Kth anagram of the original string.
Sample Input
ACM 5 ICPC 12 REGION 274 # 0
Sample Output
MAC PICC IGNORE
Hint
The value of K could be almost 245 in the largest tests, so you should use type long in Java, or type long long in C++ to store K.
題意:
給你幾個字母,可以得到它們的全排列,要字典序,然後問你第k個排列是什麼。
POINT:
1.給字母排個序。
2.假設第k個排列的第一個字母是s[0],那麼可以算出s[1]-s[l-1]有幾種可能,和k比較。
3.k小於等於這個數,就可以確定第一個字母是s[0],反之則繼續遍歷下去,再假設s[1]……,別忘記減k
4.確定第一個字母之後,刪掉它,重複1 2 3
#include <iostream>
#include <map>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL long long
int cnt[333];
int m;
char s[20];
int ans[20];
LL jie[20],k;
void init()
{
jie[0]=1;
for(int i=1;i<=16;i++)
{
jie[i]=jie[i-1]*i;
}
}
LL sum(int l)
{
LL anss=jie[l];
for(int i='A';i<='Z';i++)
{
anss/=jie[cnt[i]];
}
return anss;
}
void dfs(int now)
{
if(now==m) return;
for(int i=0;i<m-now;i++)
{
if(s[i]==s[i-1]) continue;
cnt[s[i]]--;
LL p=sum(m-now-1);
if(k<=p)
{
ans[now]=s[i];
s[i]='Z'+11;
sort(s,s+m);
dfs(now+1);
break;
}
else
{
cnt[s[i]]++;
k-=p;
}
}
}
int main()
{
init();
while(~scanf("%s %lld",s,&k))
{
if(s[0]=='#') break;
memset(cnt,0,sizeof cnt);
memset(ans,0,sizeof ans);
m=strlen(s);
for(int i=0;i<m;i++)
{
cnt[s[i]]++;
}
sort(s,s+m);
dfs(0);
for(int i=0;i<m;i++)
{
printf("%c",ans[i]);
}
printf("\n");
}
}
相關文章
- CSU 1562 Fun House(直線搜尋)
- 【Django】組合條件的搜尋功能實現Django
- 組合數的計算(利用楊輝三角/記憶化搜尋)
- 51_初識搜尋引擎_上機動手實戰多搜尋條件組合查詢
- 【火爐煉AI】機器學習017-使用GridSearch搜尋最佳引數組合AI機器學習
- 搜尋模組功能分析
- BM42:語義搜尋與關鍵詞搜尋結合
- 【數學】組合數學 - 排列組合
- SI 2120程式設計影像搜尋綜合程式設計
- 最佳路徑搜尋(二):啟發式搜尋(代價一致搜尋(Dijkstra search),貪心搜尋,A*搜尋)
- SAP CRM產品主資料搜尋功能的With individual object搜尋引數Object
- 海量資料搜尋---搜尋引擎
- PostgreSQL實踐-實時廣告位推薦2(任意欄位組合、任意維度組合搜尋、輸出TOP-K)SQL
- 搜尋
- 組合數學
- 洛谷P1563 [NOIP2016 提高組] 玩具謎題
- 搜尋引擎-03-搜尋引擎原理
- 組合數學筆記-排列與組合筆記
- Numpy 排序搜尋計數與集合操作排序
- 搜尋引擎es-分詞與搜尋分詞
- 點選搜尋框清空搜尋提示文字
- 楊輝三角(組合數)+排列組合
- win10搜尋不到工作組計算機怎麼回事 win10搜尋不到工作組其他電腦如何修復Win10計算機
- 組合數字首和
- lg組合計數
- 組合數問題
- 直播系統程式碼,常用搜尋中搜尋歷史,搜尋推薦功能
- 搜尋策略
- vim搜尋
- 搜尋功能
- 搜尋技巧
- 20240713總結(搜尋專題,但是不想搜尋)
- Elasticsearch(ES)的高階搜尋(DSL搜尋)(上篇)Elasticsearch
- Elasticsearch(ES)的高階搜尋(DSL搜尋)(下篇)Elasticsearch
- 【數學】組合數學 - 卡特蘭數
- 一類適合記憶化搜尋的區間dp
- 搜尋的未來是精品搜尋 | a16z
- 直播開發app,實時搜尋、搜尋引擎框APP