对于每个字符串,判断是否为hatword,可以先找此字符串不同的划分前缀,然后对每个前缀对应的后缀进行检查,是否满足题目条件。
#include<cstdio>
#include<cstring>
const int maxn=100000;
int node[maxn][26];
bool finish[maxn];
int pos=0;
void add(char *str)
{
int rt=0;
for(int i=0;str[i];i++)
{
int x=str[i]-'a';
if(node[rt][x]==0)
node[rt][x]=(++pos);
rt=node[rt][x];
}
finish[rt]=1;
}
bool check(char *str)
{
int len=strlen(str);
int stack[1000],top=-1;
int rt=0;
for(int i=0;str[i];i++)
{
int x=str[i]-'a';
if(node[rt][x]==0) return false;
rt=node[rt][x];
if(finish[rt]==1) {stack[++top]=i+1;}
}
while(top>=0)
{
rt=0;
for(int i=stack[top--];str[i];i++)
{
int x=str[i]-'a';
if(node[rt][x]==0) break;
rt=node[rt][x];
if(finish[rt]==1&&i==len-1) return true;
}
}
return false;
}
char temp[50000][100];
int main()
{
memset(finish,0,sizeof(finish));
memset(node,0,sizeof(node));
int k=0;
while(gets(temp[k]))
{
add(temp[k]);
k++;
}
for(int i=0;i<k;i++)
{
if(check(temp[i]))
printf("%s\n",temp[i]);
}
return 0;
}