Lucky Substrings 微软2016校园招聘在线笔试第二场

数据比较弱(100)

先算出fibonacci数列,然后建一棵树用来储存要输出的字符串。

#include <iostream>
#include <cstring>
using namespace std;

char ori[101],val[10000];
int down[10000],rig[10000],num=1;
bool end_[10000];

char * substr(int i,int j)
{
	char * m;
	int k;
	m=new char[j-i+2];
	for(k=0;k<=j-i;k++)
		m[k]=ori[k+i];
	m[j-i+1]='\0';
	return m;
}

bool add(char* p)
{
	bool flag=false;
	int s=0,i,len,a,b;
	len=strlen(p);
	for(i=0;i<len;i++) {
		if(down[s]==0) {
			down[s]=num;
			val[num]=p[i];
			flag=true;
			s=num;
			num++;
		}
		else {
			s=down[s];
			while(val[s]<p[i]&&rig[s])
				s=rig[s];
			if(val[s]==p[i])
				continue;
			if(val[s]<p[i]) {
				rig[s]=num;
				val[num]=p[i];
				flag=true;
				s=num;
				num++;
			}
			if(val[s]>p[i]) {
				rig[num]=rig[s];
				rig[s]=num;
				val[num]=val[s];
				val[s]=p[i];
				down[num]=down[s];
				down[s]=0;
				end_[num]=end_[s];
				end_[s]=false;
				flag=true;
				num++;
			}
		}
	}
	end_[s]=true;
	return flag;
}

void show(int i,char* p,int lev)
{
	int son;
	if(lev>=0)
	    p[lev]=val[i];
	if(down[i]==0) {
		p[lev+1]='\0';
		puts(p);
	}
	else {
		if(end_[i]) {
		    p[lev+1]='\0';
		    puts(p);
		}
		son=down[i];
		while(son) {
			show(son,p,lev+1);
			son=rig[son];
		}
	}
}

int main()
{
//	freopen("aa.txt","r",stdin);
	memset(down,0,sizeof(down));
	memset(rig,0,sizeof(rig));
	memset(end_,false,sizeof(end_));
	int len,i,j,coun,k,r;
	bool fa[105];
	bool aa[30];
	char* temp;
	char p[105];
	memset(fa,false,sizeof(fa));
	fa[1]=true;
	fa[2]=true;
	for(i=1,j=2;i+j<=100;k=j,j=i+j,i=k)
		fa[i+j]=true;		
	scanf("%s",ori);
	len=strlen(ori);
	r=0;
	for(i=0;i<len;i++) {
		memset(aa,false,sizeof(aa));
		coun=0;
		for(j=i;j<len;j++) {
			if(aa[ori[j]-'a']) {
				if(fa[coun]) {
					temp=substr(i,j);
					add(temp);
				}
			}
			else {
				aa[ori[j]-'a']=true;
				coun++;
				if(fa[coun]) {
					temp=substr(i,j);
					add(temp);
				}
			}
		}
	}
	show(0,p,-1);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值