3.30更新
1 #include 2 #include 3 #include 4 #include5using
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 5using
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...