Hat’s Words
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8778 Accepted Submission(s): 3151
You are to find all the hat’s words in a dictionary.
Only one case.
#include <stdio.h>
#include <string.h>
struct node
{
bool flag;
node *next[26];
node()
{
flag = false;
memset(next,0,sizeof(next));
}
};
char mp[50001][110];
int mplen[50001];
int stk[50001];
void build(node *&head,char str[],int len)
{
node *p = head,*q;
for(int i = 0; i < len; i++)
{
int zh = str[i] - 'a';
if(p->next[zh])
{
p = p->next[zh];
}
else
{
q = new node;
p->next[zh] = q;
p = q;
}
}
p->flag = true;
}
bool nfind(node *&head,char str[],int len)
{
node *p = head;
int tp = 0;
for(int i = 0; i < len; i++)
{
int zh = str[i] - 'a';
if(p->next[zh])
p = p->next[zh];
if(p->flag && i + 1 < len)
stk[tp++] = i + 1;//一個單詞可能有多個組成,或是一個單詞遍歷的時候,會有多個true在裏面,這裏都記錄下來
}
while(tp)
{
bool flag = true;
int i = stk[tp - 1];
tp--;
p = head;
for(; i < len; i++)
{
int zh = str[i] - 'a';
if(p->next[zh])
{
p = p->next[zh];
}
else
{
flag = false;//注意這個地方,噹噹前從i開始不能找到,並不代表棧裏面所有的都找不到
break;
}
}
if(p->flag && flag)
return true;
}
return false;
}
int main()
{
node *head = new node;
int k = 0;
while(~scanf("%s",mp[k]))
{
mplen[k] = strlen(mp[k]);
build(head,mp[k],mplen[k]);
k++;
}
for(int i = 0; i < k; i++)
{
if(nfind(head,mp[i],mplen[i]))
printf("%s\n",mp[i]);
}
return 0;
}