1. 程式人生 > 其它 >2015藍橋杯C++A組——手鍊樣式

2015藍橋杯C++A組——手鍊樣式

手鍊樣式題目連結

目錄

問題描述

【題目描述】
在這裡插入圖片描述
【輸出】
在這裡插入圖片描述

題目解析

這道題是全排列+特殊去重的經典,手鍊任意轉動或翻轉就是去重的關鍵。去重的關鍵就是: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; }

正確答案

在這裡插入圖片描述