字典树模板题,但map更容易些
代码:
#include<iostream>
using namespace std;
struct Node
{
bool flag;
Node *next[26];
Node()
{
for(int i=0;i<26;i++)
{
next[i]=NULL;
flag=false;
}
}
}root;
void chuli(char * x)//建树
{
Node *p=&root;
for(int i=0;x[i];i++)
{
int k=(x[i]-'a');
if(p->next[k]==NULL)
{
p->next[k]= new Node;
}
p=p->next[k];
}
p->flag=true;
}
bool find2(char *str, int i)//查询
{
Node *p = &root;
for (int j=i; str[j]; j++)
{
int k = str[j] - 'a';
if (p -> next[k] == NULL)
return false;
p = p->next[k];
}
return p->flag;
}
void find1(char * x)
{
Node *p=&root;
for(int i=0;x[i];i++)
{
int k=(x[i]-'a');
if(p->next[k]==NULL)
{
break;
}
if(p->flag&&find2(x,i))
{
cout<<x<<endl;
break;
}
p=p->next[k];
}
}
int main()
{
char a[50010][17];
int k=0;
while(cin>>a[k])
{
chuli(a[k]);
k++;
}
for(int i=0;i<k;i++)
{
find1(a[i]);
}
return 0;
}
map代码:
#include<iostream>
#include<string>
#include<map>
using namespace std;
int main()
{
map<string,int> s;
string a[50010];
int t=0;
while(cin>>a[t])
{
s[a[t]]=1;
t++;
}
int i,j;
for(i=0;i<t;i++)
{
int len=a[i].length();
for(j=0;j<len;j++)
{
string b1=a[i].substr(0,j);
string b2=a[i].substr(j,len);
if(s[b1]==s[b2]&&s[b1]==1)
{
cout<<a[i]<<endl;
break;
}
}
}
return 0;
}