好好好,就我这个耳鼻打的字典树是吧
(只能过样例,第二个点就炸了)
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int t,n;
string s[N];
struct E{
vector<int> c;
int s[28]={0};
}p[N];
int n_p=1;
void prt_cre(int r,int k,string s,int id)
{
if(p[r].s[s[k]-'a'+1]==0)
{
n_p++;
p[r].s[s[k]-'a'+1]=n_p;
}
if(k==(int)s.size()-1)
{
p[p[r].s[s[k]-'a'+1]].c.push_back(id);
return ;
}
prt_cre(p[r].s[s[k]-'a'+1],k+1,s,id);
}
vector<int> s_find1(string s)
{
vector<int> e;
int r=1,k=0;
while(k<(int)s.size())
{
r=p[r].s[s[k]-'a'+1];
if(p[r].c.size()!=0) e.push_back(k+1);
k++;
}
return e;
}
bool s_find2(string s)
{
int r=1,k=0;
while(k<(int)s.size())
{
r=p[r].s[s[k]-'a'+1];
if(!r) return false;
k++;
}
if(p[r].c.empty()) return false;
return true;
}
string s_cut(string s,int r)
{
string w;
int l=s.size();
for(int i=r;i<l;i++) w.push_back(s[i]);
return w;
}
int main()
{
cin>>t;
for(int kk=1;kk<=t;kk++)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>s[i];
int r[N]={0};
for(int i=1;i<=n;i++) prt_cre(1,0,s[i],i);
// for(int i=1;i<=n_p;i++)
// {
// cout<<"id : "<<i<<"\n";
// for(int j=1;j<=26;j++)
// {
// if(p[i].s[j]) cout<<(char)('a'-1+j)<<" : "<<p[i].s[j]<<" ";
// }
// cout<<"\n";
// int l=p[i].c.size();cout<<l<<" ";
// for(int j=0;j<l;j++) cout<<s[p[i].c[j]]<<" ";
// cout<<"\n\n";
// }
// vector<int> e=s_find1(s[1]);
// int l=e.size();
// for(int i=0;i<l;i++) cout<<e[i]<<" ";
// cout<<"\n";
for(int i=1;i<=n;i++)
{
vector<int> w=s_find1(s[i]);
int l=w.size();
int op=0;
for(int j=0;j<l-1;j++)
if(s_find2(s_cut(s[i],w[j]))) op++;
if(op) r[i]=1;
}
// cout<<s_cut(s[1],4)<<"\n";
for(int i=1;i<=n;i++) cout<<r[i];
cout<<"\n";
}
}
/*
1
8
codeforc
es
codes
cod
forc
forces
e
code
*/