40wa求hank
查看原帖
40wa求hank
705012
Miss_SGT楼主2023/10/13 19:52
#include<bits/stdc++.h>
using namespace std;
const int N=52;
inline void read(int &x){
	int f=1;x=0;char c=getchar();
	while(!isdigit(c)&&c^'-') c=getchar();
	if(c=='-') f=-1,c=getchar();
	while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
	x*=f;
}
int n,len[N],cnt[N],f[N];
char s[N][N];
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
inline bool Pre(int x,int y){
	if(len[x]>=len[y]) return 0;
	for(int i=1;i<=len[x];i++)
		if(s[x][i]^s[y][i]) return 0;
	return 1;
}
long long ans=1;
int main(){
	read(n);
	for(int i=1;i<=n;i++){
		scanf("%s",s[i]+1);
		len[i]=strlen(s[i]+1);
		f[i]=i;
		for(int j=1;j<i;j++)
			if(Pre(i,j)||Pre(j,i))
				f[find(j)]=i;
	}
	for(int i=1;i<=n;i++) ++cnt[find(i)];
	for(int i=1;i<=n;i++) ans*=(cnt[i]+1);
	printf("%lld",ans);
	return 0;
}

找的联通块,一个块内只能选一个或不选,所以方案数是联通块大小加1,最后乘起来,感觉没问题

2023/10/13 19:52
加载中...