hihocoder #1152 : Lucky Substrings

来源:互联网 发布:导出数据库命令 编辑:程序博客网 时间:2024/06/10 20:27

描述

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

样例输出

aaaaabaabcababcbbcbcdccdd

  这道题的意思一开始理解错了,坑了半天。。。。
  正确的意思是,在字符串S中,如果不同的字符个数满足斐波那契数列也就是1,1,2,3,5,8……(注意是从1开始的)那么这个字符串就是lucky的。比如说字符串“afgagfds”它的不同的字符个数是5个,那么它就是lucky的;再比如“asdfa”不同的字符有4个,就不属于lucky。题目最后就要按照字典序输出一个字符串中所有的lucky子串。
  首先我计算了斐波那契数列,在BOOL数组对应位置置为true,其余的为false,用的时候就直接取对应的位置找是否在数列中。比方说,3在斐波那契数列中,则数组[3]=true,然后在实际判断中用if(数组[3])。我用了substr()函数截取子串

_Myt substr(size_type _Off = 0, size_type _Count = npos) const

  第一个参数是起始位置,第二个参数是截取的长度。截取好子串后,就用一个num数组来记录某个字符被访问过没,访问了就置true,初始值置为false。若对应的位置为true,就知道这个字符出现过,不用继续统计了。用count保存不同的字符个数。然后用if(数组[count]),判断count是否在斐波那契数列中。如果是就插入到set中,set是一个关联式容器,而且能按照字典序自动排序,也就是说,往set里面一塞就好,不用担心顺序问题了。最后输出set中的所有元素。下面是AC代码:
  

//#1152 : Lucky Substrings#include<iostream>#include<map>#include<string.h>#include<string>#include<queue>#include<vector>#include <stdio.h>#include<fstream>#include<set>#include<stdlib.h>using namespace std;#define Min(a,b) a<b?a:b#define INF 1000000005#define Num 100000+5bool feibo[101];set<string> jieguo;int LuShi(){    string str;    cin >> str;    memset(feibo, false, sizeof(feibo));    int a = 1, b = 1;    while (b<101)//计算好斐波那契数列    {        feibo[b] = true;        int c = a + b;        a = b;        b = c;    }    /*string tempStr = str.substr(2, 2);    cout << tempStr << endl;*/    for (int i = 0; i < str.length(); i++)//从字符串头开始    {        for (int j = 1; j < str.length()-i+1; j++)//每次截取的长度大于0,小于剩余的长度        {            bool num[30];            int count = 0;            memset(num, false, sizeof(num));            string tempStr = str.substr(i, j);            for (int k = 0; k < tempStr.length(); k++)            {                if (!num[tempStr[k] - 'a']) {//如果这个字符未被访问过                    count++;//计数+1                    num[tempStr[k] - 'a'] = true;//标记该字符已经被访问过                }            }            if (feibo[count]) {//如果count属于斐波那契数列                jieguo.insert(tempStr);            }        }    }    for (set<string>::iterator i = jieguo.begin(); i != jieguo.end(); i++)    {        cout << *i << endl;//由于set容器已经自动排序了,因此只用按照顺序输出就好    }    return 0;}int main(){    //Solution sol;    //重定向,OJ时注意把它注释掉    streambuf * oldbuf = cin.rdbuf((new ifstream("C:\\Users\\yzc\\Desktop\\input.txt"))->rdbuf());    //cout << LuShi() << endl;    LuShi();    system("pause");    //Fromfile.close();    return 0;}
0 0
原创粉丝点击