1. 程式人生 > >浙大pat | 浙大pat 牛客網PAT頂級(Top Level)練習題 1001

浙大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;

}