时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
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.
输入
A string consisting no more than 100 lower case letters.
输出
Output the lucky substrings in lexicographical order, one per line. Same substrings should be printed once.
样例输入
aabcd
样例输出
a
aa
aab
aabc
ab
abc
b
bc
bcd
c
cd
d
#include "iostream"
#include "set"
#include "algorithm"
#include "string"
#include "string.h"
#include "stdlib.h"
using namespace std;
int alphabet[26];
int num;
set<int> Fibonaccid;
set<string> ansList;
//统计一个子串的不同字母个数
int isLuck(char c)
{
int index = c - 'a';
if(alphabet[index] == 0)
{
alphabet[index] = 1;
num++;
}
return Fibonaccid.count(num);
}
int main()
{
//S均由小写字母组成,因此其包含的不同字母个数最多为26个。而在26以内且属于fibonacci数列的数为1,2,3,5,8,13,21
Fibonaccid.insert(1); Fibonaccid.insert(2); Fibonaccid.insert(3); Fibonaccid.insert(5);
Fibonaccid.insert(8); Fibonaccid.insert(13); Fibonaccid.insert(21);
string s;
cin >> s;
int i, j;
for(i=0; i<s.length(); i++)
{
num = 0;
memset(alphabet, 0, sizeof(alphabet));
for(j=i; j<s.length(); j++) //在已经知道S[i..j]字母个数的情况下,可以直接推导出S[i..j+1]的不同字母个数
if(isLuck(s[j]) > 0)
{
string subStr = s.substr(i, j-i+1);
ansList.insert(subStr);
}
}
set<string>::iterator it;
for(it=ansList.begin(); it!=ansList.end(); it++)
{
cout << *it << endl;
}
return 0;
}