您的位置:首页 > 其它

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

2015-05-10 18:11 447 查看
数据比较弱(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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: