//题意是判断一个数字字符串是否是另一个的前缀,如果有,则输出Set %d is not immediately decodable,否则输出另一种
#include<cstring>
{
int count;
struct node *next[9];
}Node;
Node *root;
Node *p;
p = (Node *)malloc(sizeof(Node));
for (int i = 0; i < 9; i++)
p->next[i] = NULL;
p -> count = 0;
return p;
}
Node *p;
p = root;
for (int i = 0; i < strlen(s); i++)
{
if (p->next[s[i]-'0'] == NULL)
{
p->next[s[i]-'0'] = newNode();
}
if (p != NULL)//判断以前是否有过改单词,如果有,则将传来的参数设置成-1,跳出循环即可
{
if (p->count >= 1)
{
*q = -1;
break;
}
}
p = p->next[s[i]-'0'];
}
p->count++;
}
int main()
{
char s[12];
root = newNode();
bool flag = true;
int i = 1;
while (~scanf("%s", s))
{
int a = 0;//没有什么实际意义,只是为了指针p的初始化
int *p = &a;
if (strcmp(s, "9") != 0)
{
insert(s, p);
if (*p == -1)
flag = false;
}
else
{
if (flag)
printf("Set %d is immediately decodable\n", i++);
else
printf("Set %d is not immediately decodable\n", i++);
memset(root->next, NULL, sizeof(root->next));//把root的next指针初始化为NULL,为了下一组数据的使用
flag = true;
}
}
return 0;
}
//字典树修改一下即可
#include<iostream>
#include<cstdio>#include<cstring>
#include<cstdlib>
using namespace std;
typedef struct node{
int count;
struct node *next[9];
}Node;
Node *root;
Node *newNode()
{Node *p;
p = (Node *)malloc(sizeof(Node));
for (int i = 0; i < 9; i++)
p->next[i] = NULL;
p -> count = 0;
return p;
}
void insert(char *s, int *q)//*q这个指针的设置是为了判断字典树中是否已存在某个数字串
{Node *p;
p = root;
for (int i = 0; i < strlen(s); i++)
{
if (p->next[s[i]-'0'] == NULL)
{
p->next[s[i]-'0'] = newNode();
}
if (p != NULL)//判断以前是否有过改单词,如果有,则将传来的参数设置成-1,跳出循环即可
{
if (p->count >= 1)
{
*q = -1;
break;
}
}
p = p->next[s[i]-'0'];
}
p->count++;
}
int main()
{
char s[12];
root = newNode();
bool flag = true;
int i = 1;
while (~scanf("%s", s))
{
int a = 0;//没有什么实际意义,只是为了指针p的初始化
int *p = &a;
if (strcmp(s, "9") != 0)
{
insert(s, p);
if (*p == -1)
flag = false;
}
else
{
if (flag)
printf("Set %d is immediately decodable\n", i++);
else
printf("Set %d is not immediately decodable\n", i++);
memset(root->next, NULL, sizeof(root->next));//把root的next指针初始化为NULL,为了下一组数据的使用
flag = true;
}
}
return 0;
}