浙大pat | 浙大pat 牛客網PAT頂級(Top Level)練習題 1001
題目描述
A string s is LUCKY if and only if the number of differentcharacters in s is a fibonacci number. Given a string consisting of only lowercase letters , output all its lucky non-empty substrings in lexicographicalorder. Same substrings should be printed once.
輸入描述:
a string consisting no more than 100 lower case letters.
輸出描述:
output the lucky substrings in lexicographical order.one perline. Same substrings should be printed once.
輸入例子:
aabcd
輸出例子:
a
aa
aab
aabc
ab
abc
b
bc
bcd
c
cd
d
看來浙大pat果然比我想的要簡單
這一題給你一個字串,讓你輸出其所有符合要求的子串,要求為子串中不同的字元數要是一個斐波那契數,且子串要按照字典序輸出,相同的子串不能重複輸出
斐波那契數為斐波那契數列中的數
這一題要是不使用stl的話確實挺難的,但是可以藉助stl中的set資料結構簡化過程
Set資料結構具有一個性質,就是其中的所有數都是唯一的,假如插入相同的數,相同的數會被消除掉,並且其中的數會預設按照從小到大的順序排列,這一點set和map非常像。Map中的成員會按照key從小到大排序,並且會自動消除相同的資料
那麼set如何從大到小排序呢,自定義成員如何排序呢
自定義成員可以使用友元操作符過載,(這裡需要注意的,對於某個類而言,假如已經在他的定義裡面過載了操作符,那麼不能再在外面過載操作符,因此在主函式外面過載不是自己定義的類的操作符是不行的)
第二組方法是使用函式物件,即可以像呼叫函式一樣呼叫的物件,程式封裝了兩個預設的函式物件,分別為greater<T>,和less<T>,一個是按照從大到小的順序排列,一個是按照從小到大的順序排列,不過greater<T>我貌似沒有找到,我們也可以自己定義
Struct tmp {
Bool operator ()(const & T a,const & T b)
{
Return a<b;
}
以上這個是按照從小到大排序的自定義函式,這裡需要注意的是,當對map定義排序函式的時候,要針對key來定義排序類,而不是像sort一樣,是針對線性表裡面的成員的類別定義排序函式
Map和set都是使用紅黑樹來儲存的!
#include<iostream>
#include<set>
#include<vector>
using namespacestd;
int main()
{
string theNum;
cin >> theNum;
set<string> theMark;
bool theC[22] = { false };
int one = 1,two=1,tmp;
tmp = one + two;
theC[one] = true; theC[two] = true;
while (tmp < 26)
{
theC[tmp] = true;
one = two;
two = tmp;
tmp = one + two;
}
vector<bool> theTmpMark(26, false);int theAllAlpha = 0;
for (int i = 0; i < theNum.size(); i++)
{
for (int j = i; j <theNum.size(); j++)
{
if(!theTmpMark[theNum[j]-'a'])
{
theAllAlpha++;
theTmpMark[theNum[j] -'a'] = true;
}
if (theC[theAllAlpha])
{
theMark.insert(theNum.substr(i,j - i + 1));
}
}
theAllAlpha = 0;
for (int i = 0; i < 26; i++)
theTmpMark[i] = false;
}
for (auto u : theMark)
{
cout << u<<endl;
}
return 0;
}