解题报告
这题以前就做过了,不过以前的解法类似暴力。。。
不过当初排序还是冒泡过的~~~
#include<stdio.h>
#include<string.h>
int main()
{
int i,l[10],k,j,t,p,q=0,m=0,n=0;
char str[8][11],ch[11];
while(gets(str[0])!=NULL)
{
n++;
i=1;
l[0]=strlen(str[0]);
while(gets(str[i])!=NULL)
{
if(str[i][0]=='9')
break;
l[i]=strlen(str[i]);
i++;
}
for(j=0;j<i;j++)
for(k=j+1;k<i;k++)
if(l[j]>l[k])
{
strcpy(ch,str[j]);
strcpy(str[j],str[k]);
strcpy(str[k],ch);
t=l[j];
l[j]=l[k];
l[k]=t;
}
for(j=0;j<i-1;j++)
{
q=0;
for(k=j+1;k<i;k++)
{
q=0;
for(p=0;p<l[j];p++)
if(str[j][p]==str[k][p])
q++;
if(q==l[j])
{
m++;
}
}
}
if(m!=0)
{
printf("Set %d is not immediately decodable\n",n);
m=0;
}
else printf("Set %d is immediately decodable\n",n);
}
return 0;
}
现在学字典数了,先建字典树,不过思路有点奇葩。。。我是先排序在建树,消掉小的字符串在大字符串里出现的标记。。。
话说这判断前缀的思路自己都没明白过来。。。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
struct node
{
int v;
node *next[2];
};
node *newnode()
{
node *p=new node;
p->v=0;
p->next[0]=NULL;
p->next[1]=NULL;
return p;
}
void insertnode(node *root,char *str)
{
node *p=root;
int f=0;
int l=strlen(str);
for(int i=0;i<l;i++)
{
int t=str[i]-'0';
if(p->next[t]==NULL)
p->next[t]=newnode();
p=p->next[t];
if(p->v==1)
p->v=0;
}
p->v=1;
}
int find(node *root,char *str)
{
node *p=root;
int l=strlen(str);
int i;
for(i=0;i<l;i++)
{
int t=str[i]-'0';
if(p->next[t]==NULL)
return 0;
p=p->next[t];
}
if(p->v!=1)
return 1;
return 0;
}
int main()
{
char str[1000][1000],ch[1000];
int i,n=0,j,k,l[1000],t;
while(gets(str[0])!=NULL)
{
n++;
i=1;
l[0]=strlen(str[0]);
node *root=newnode();
while(gets(str[i])!=NULL)
{
if(str[i][0]=='9')
break;
l[i]=strlen(str[i]);
i++;
}
for(j=0;j<i;j++)
for(k=j+1;k<i;k++)
if(l[j]>l[k])
{
strcpy(ch,str[j]);
strcpy(str[j],str[k]);
strcpy(str[k],ch);
t=l[j];
l[j]=l[k];
l[k]=t;
}
for(j=0;j<i;j++)
{
insertnode(root,str[j]);
}
int f=0;
for(int j=0;j<i;j++)
{
if(find(root,str[j]))
f=1;
}
if(f)
printf("Set %d is not immediately decodable\n",n);
else printf("Set %d is immediately decodable\n",n);
}
return 0;
}
解题报告
意思跟上面那题一样,就是时间上比上一题小,需要1000ms跑完。。。
把冒泡改成快排,可以快过去。。。
由于定义的结构体数组,所以快排比较函数得自己敲。。。
struct cnode
{
char num[200];
int l;
};
int cmp(const void *a,const void *b)//升序
{
return (((cnode *)a)->l-((cnode *)b)->l);
}
好像静态分配省时间的。。。
好像还得释放内存的。。。静态不用。。。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
struct cnode
{
char num[200];
int l;
};
int cmp(const void *a,const void *b)
{
return (((cnode *)a)->l-((cnode *)b)->l);
}
struct node
{
int v;
node *next[10];
}T[1100000];//静态分配
int t = 0;
node *newnode()
{
node *p= &T[t++];
p->v=0;
for(int i=0;i<10;i++)
{
p->next[i]=NULL;
}
return p;
}
void insertnode(node *root,char *str)
{
node *p=root;
int l=strlen(str);
for(int i=0;i<l;i++)
{
int t=str[i]-'0';
if(p->next[t]==NULL)
p->next[t]=newnode();
p=p->next[t];
if(p->v==1)
p->v=0;
}
p->v=1;
}
int find(node *root,char *str)
{
node *p=root;
int l=strlen(str);
for(int i=0;i<l;i++)
{
int t=str[i]-'0';
if(p->next[t]==NULL)
return 0;
p=p->next[t];
}
if(p->v!=1)
return 1;
return 0;
}
/*void freenode(node *root)//释放内存
{
node *p=root;
for(int i=0;i<10;i++)
if(p->next[i])freenode(p->next[i]);
free(p);
}*/
cnode str[20000];
int main()
{
int t,n,m,tt;
int i,j,k;
scanf("%d",&tt);
while(tt--)
{
t = 0 ;
node *root=newnode();
scanf("%d%*c",&n);
for(i=0;i<n;i++)
{
scanf("%s",str[i].num);
str[i].l=strlen(str[i].num);
}
qsort(str,n,sizeof(str[0]),cmp);
for(i=0;i<n;i++)
insertnode(root,str[i].num);
int f=0;
for(i=0;i<n;i++)
{
if(find(root,str[i].num))
f=1;
}
if(f)printf("NO\n");
else printf("YES\n");
//freenode(root);
}
return 0;
}