“字典树”
查看原帖
“字典树”
1072846
xingjunlong6789楼主2024/9/26 18:50

好好好,就我这个耳鼻打的字典树是吧

(只能过样例,第二个点就炸了)

#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

*/
2024/9/26 18:50
加载中...