2015藍橋杯C++A組——手鍊樣式
阿新 • • 發佈:2021-04-27
目錄
問題描述
【題目描述】
【輸出】
題目解析
這道題是全排列+特殊去重的經典,手鍊任意轉動或翻轉就是去重的關鍵。去重的關鍵就是:s’是否是s的轉動等價於s’是否是s+s的子串。舉個例子字串abc,要想知道cab是不是abc的轉動後的結果只需看cab是不是abcabc的子串即可。這就是這道題特殊去重的關鍵。
C++程式碼
int main()
{
string s = "aaabbbbccccc";
vector<string> v1;
int ans = 0;
do //全排列的一般格式
{
int i=0;
for(;i<v1.size();i++) //排出重複,對於v1中的每個元素進行檢查如果存在s的旋轉或者翻轉就跳過
{
if(v1[i].find(s)!=string::npos) break; //看s是否存在於當前v1[i]的子串中
}
if(i!=v1.size()) continue;
string s2=s+s;
v1.push_back(s2); //若果vector中存在當前排列,就跳過,判斷旋轉的情況
reverse(s2.begin(),s2.end());
v1.push_back(s2);
ans++;
}
while(next_permutation(s.begin(),s.end()));
cout<<ans<<endl;
return 0;
}