程序代码:
#include<iostream>
#include<string>
using namespace std;
#define maxn 3300000
struct Node
{
int nxt[26];
int cnt[26];
};
Node node[maxn];
int cnt,n;
void insert(char src[])// 插入操作
{ int len = strlen(src),r = 1,i,j,pos;
for(j=0;j<len;j++)
{ pos = src[j]-'a';
if(node[r].nxt[pos]==-1)
{ node[r].nxt[pos] = ++cnt;
for(i=0;i<26;i++)
{ node[cnt].nxt[i] = -1;
node[cnt].cnt[i] = 0;
}
if(j==len-1)
node[r].cnt[pos]++;
r = cnt;}
else
{
if(j==len-1)
node[r].cnt[pos]++;
r = node[r].nxt[pos];
}
}
}
bool dele(char src[])// 删除操作
{
int r = 1,len = strlen(src),i,pos;
for(i=0;i<len;i++)
{ pos = src[i]-'a';
if(node[r].nxt[pos] != -1)
{ if(i==len-1&&node[r].cnt[pos] > 0)
{ node[r].cnt[pos] = 0;
return true;}
r = node[r].nxt[pos];
}
else
break;
}
return false;
}
void travel(int r,char src[],int pos)// 遍历操作
{
if(r == -1)return ;
int i,j;
for(i=0;i<26;i++)
{
if(node[r].nxt[i] != -1)
{
src[pos] = i + 'a';
if(node[r].cnt[i] > 0)
printf("%s\n",src);
travel(node[r].nxt[i],src,pos+1);
}
}
src[pos] = '\0';
}
bool search(char src[])// 查找操作
{
int r = 1,len = strlen(src),i,pos;
for(i=0;i<len;i++)
{
pos = src[i]-'a';
if(node[r].nxt[pos] != -1)
{
if(i==len-1&&node[r].cnt[pos] > 0)
return true;
r = node[r].nxt[pos];
}
else
break;
}
return false;
}
int main()
{
cnt = 1;
for(int i=0;i<26;i++)
{
node[1].nxt[i] = -1;
node[1].cnt[i] = 0;
}
char tname[35];
n = 0;
while(gets(tname)!=NULL)
{
if(tname[0]=='\0')
break;
insert(tname);
n++;
}
if(search("aa"))
printf("yes\n");
else
printf("no\n");
if(search("aaa"))
printf("yes\n");
else
printf("no\n");
dele("aaa");
if(search("aaa"))
printf("yes\n");
else
printf("no\n");
memset(tname,'\0',sizeof(tname));
travel(1,tname,0);
return 0;
}
PS:鉴于这两天挑灯夜战,都快垮了。。。吃饭没胃口,硬的东西吃不下。。。55555。。。只要打起精神就会好吧。。。亲,看书去吧~!