题目描述
A string s is LUCKY if and only if the number of different characters in s is a fibonacci number. Given a string consisting of only lower case letters , output all its lucky non-empty substrings in lexicographical order. Same substrings should be printed once.
IDEA
1.fibonacci number:fibonacci数列中的数,满足第i数是i-1与i-2个数的和
2.找字符串的子串,用set去重复
CODE
#include<iostream>
#include<string>
#include<set>
#include<vector>
#include<algorithm>
#include<fstream>
using namespace std;
vector<int> fib;
int isFib(int a){
if(fib.size()<2){
fib.push_back(1);
fib.push_back(2);
}
while(a>fib.back()){
fib.push_back(fib[fib.size()-1]+fib[fib.size()-2]);
}
if(find(fib.begin(),fib.end(),a)!=fib.end()){
return 1;
}
return 0;
}
int diffNum(string s){
vector<int> flag(26,0);
int cnt=0;
for(int i=0;i<s.length();i++){
if(!flag[s[i]-'a']){
cnt++;
flag[s[i]-'a']=1;
}
}
return cnt;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif
string str;
cin>>str;
set<string> s;
int n=1;
while(n<str.length()){
for(int i=0;i<=str.length()-n;i++){
string subs=str.substr(i,n);
if(isFib(diffNum(subs))){
s.insert(subs);
}
}
n++;
}
set<string>::iterator it=s.begin();
for(;it!=s.end();it++){
cout<<*it<<endl;
}
return 0;
}