蒟蒻求助!!!
查看原帖
蒟蒻求助!!!
118000
returnG楼主2020/6/6 09:49

50分WA

我太蒻了

码风不好请见谅

#include <bits/stdc++.h>
using namespace std;
int n;
string str[100005];
int b[100005];
int ch[510005][30];
vector<int>to[100005];//dfs前向星链表
map <int,int> a;//trie到dfs的映射 
int fa[100005];
int size[100005];
int wz[100005];
int cnttt=0;
int cntt=0;
int cnt=1;
long long ans=0;
bool cmp(int x,int y){
	return size[x]<size[y];
}
bool cmpstr(string x,string y){
	return x<y;
}
void biuld(string ccc){
	int u=1;
	int last=1;
	for(int i=0;i<ccc.size();i++){
		int c=ccc[i]-'a';
		if(!ch[u][c]){
			ch[u][c]=++cnt;
			u=cnt;
		}else{
			u=ch[u][c];
		}
		if(b[u])last=u;
	}
	fa[++cntt]=a[last];
	a[u]=cntt;
	b[u]=1;
}
void dfsprint(int now){
	cout<<now;
	for(vector<int>::iterator it=to[now].begin();it!=to[now].end();it++){
		dfsprint(*it);
	}
}
void dfs1(int now){
	if(to[now].size()==0){
		size[now]=1;
	}else{
		size[now]=1;
		for(vector<int>::iterator it=to[now].begin();it!=to[now].end();it++){
			dfs1(*it);
			size[now]+=size[*it];
		}
	}
}
void dfs2(int now,int last){
	//cout<<now<<endl;
	++cnttt;
	wz[now]=cnttt;
	ans+=cnttt-wz[last];
	sort(to[now].begin(),to[now].end(),cmp);
	for(vector<int>::iterator it=to[now].begin();it!=to[now].end();it++){
		dfs2(*it,now);
	}
}
int main() {
	cin>>n;
	for(int i=0;i<=26;i++)ch[0][i]=1;
	a[1]=0;
	string fk;
	for(int i=1;i<=n;i++){
		cin>>fk;
		int len=fk.size();
		str[i]=fk;
		for(int j=0;j<len;j++)str[i][j]=fk[len-1-j];
	}
	sort(str+1,str+n+1);
	//for(int i=1;i<=n;i++)cout<<str[i]<<endl;
	for(int i=1;i<=n;i++)biuld(str[i]);
	for(int i=1;i<=cntt;i++)to[fa[i]].push_back(i);
	dfs1(0);
	wz[0]=0;
	sort(to[0].begin(),to[0].end(),cmp);
	for(vector<int>::iterator it=to[0].begin();it!=to[0].end();it++){
		dfs2(*it,0);
	}
	//dfsprint(0);
	//for(int i=1;i<=n;i++)cout<<size[i]<<endl;
	cout<<ans;
	return 0;
}
2020/6/6 09:49
加载中...