EOJ 3023 字元組合

2022-09-04 05:24:10 字數 2003 閱讀 7803

3.30更新

1 #include 2 #include 3 #include 4 #include 

5using

namespace

std;

6int

main()

726 printf("

case #%d:\n

",m);

27for(string x:ans)cout282930}

31return0;

32 }

使用位運算更簡便,更新排序unique的操作,並且使用set容器。

3.29更新

1 #include2

#define all(x) x.begin(),x.end()

3using

namespace

std;

4set

ans;

5string

s,ss,ret;

6void comb(int n,string s)12}

13int

main()14;

19ans.clear();

20sort(all(s));

21unique_copy(all(s),back_inserter(ss));

22 comb(0

,ret);

23 printf("

case #%d:\n

",m);

24for(string x:ans) cout<< x <26return0;

27 }

用遞迴方式實現,核心**只需3行!

既然題目說明ab和ba等價,每次只需要從上乙個指定位置向後看就好了。比如遞迴b的時候就不會從a開始了。

一開始用回溯,加加減減的沒有必要,既然遞迴的區域性變數在函式退出時消亡,乾脆直接傳進去好了。

輸入乙個由字母組成的字串 s(1≤長度≤16),按字典序輸出由 s 中不同字元組成的所有字元組合(每個組合中的字元也按字典序排列)。

例如:「cbaabc」 中的不同字元是 『a』、『b』、『c』 共 3 個,則 1 個字元組成的組合是 「a」、「b」、「c」3 種,2 個字元組成的組合是 「ab」、「bc」、「ac」3 種,3 個字元組成的組合是 「abc」1 種。注意:「ab」 和 「ba」 由相同字元組合而成,因此可認為是同乙個組合。那麼這個例子共有 7 種組合,按序分別為 「a」、「ab」、「abc」、「ac」、「b」、「bc」、「c」。

1 #include 2 #include 3 #include 4 #include 5

using

namespace

std;

6int

main()

7;char

c;12 vectorv;

13string s;cin>>s;

14for(char

x:s) v.push_back(x);

15sort(v.begin(),v.end());

16 v.resize(unique(v.begin(),v.end())-v.begin());

1718

int ll=v.size();

19long

long sum=0;20

for(int i=0;i)

21 sum+=pow(2

,i);

22 vectorans;

23for(;sum>=1;sum--)

2430

sort(ans.begin(),ans.end());

31 printf("

case #%d:\n

",m);

32for(int i=0;i)

33 cout343536}

37return0;

38 }

排序去重後二進位制列舉即可。

3023 字元組合

單點時限 2.0 sec 記憶體限制 256 mb 輸入乙個由字母組成的字串 s 1 長度 16 按字典序輸出由 s 中不同字元組成的所有字元組合 每個組合中的字元也按字典序排列 例如 cbaabc 中的不同字元是 a b c 共 3 個,則 1 個字元組成的組合是 a b c3 種,2 個字元組成...

EOJ 3194 字串消除

給定乙個由大寫字母 a b c 構成的字串s,按如下進行消除過程 1 字串s中連續相同字母組成的子串,如果子串的長度大於1,那麼這些子串會被同時消除,餘下的字元拼成新的字串。例如 abccbcccaa 中 cc ccc 和 aa 會被同時消除,餘下 ab 和 b 拼成新的字串 abb 2 反覆進行上...

EOJ 1805 字串匹配 字尾陣列

給你 2 個字串 可能包括數字以及標點 長度不超過 50124,請你求出最長的連續的公共子串行。不知道是不是資料改了,導致這個似乎是n 2的演算法也能暴力過去 include using namespace std int main maxl max maxl,len printf d n maxl...