【BZOJ3555】企鹅QQ

蛤希。

用map会T。

只需要枚举删掉哪个字符,然后算出每个的hash值,sort一遍就行了。

用map会T!!!

// It is made by XZZ
#include<cstdio>
#include<algorithm>
#include<map>
#define il inline
#define rg register
#define vd void
#define sta static
typedef long long ll;
il int gi(){
	rg int x=0,f=1;rg char ch=getchar();
	while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar();
	while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
	return x*f;
}
#define mod 998244353
#define Mod 10000000009
char s[210];
ll base[210],f[210],F[30010][210],Base[210],g[210],G[30010][210];
ll S[30010];
int main(){
#ifdef xzz
	freopen("3555.in","r",stdin);
	freopen("3555.out","w",stdout);
#endif
	int n=gi(),L=gi();gi();
	ll ans=0;
	base[0]=1;for(rg int i=1;i<=L;++i)base[i]=base[i-1]*8237%mod;
	Base[0]=1;for(rg int i=1;i<=L;++i)Base[i]=Base[i-1]*19260817%mod;
	for(rg int yyb=1;yyb<=n;++yyb){
		scanf("%s",s+1);
		for(rg int i=1;i<=L;++i)f[i]=(s[i]*233%2333)*base[i]%mod;
		F[yyb][1]=0;
		for(rg int i=1;i<=L;++i)F[yyb][1]+=f[i];
		F[yyb][1]%=mod;for(rg int i=1;i<=L;++i)F[yyb][i]=F[yyb][1];
		for(rg int i=1;i<=L;++i)F[yyb][i]=(F[yyb][i]-f[i]+mod)%mod;
		for(rg int i=1;i<=L;++i)g[i]=(s[i]*233%2333)*Base[i]%Mod;
		G[yyb][1]=0;
		for(rg int i=1;i<=L;++i)G[yyb][1]+=g[i];
		G[yyb][1]%=Mod;for(rg int i=1;i<=L;++i)G[yyb][i]=G[yyb][1];
		for(rg int i=1;i<=L;++i)G[yyb][i]=(G[yyb][i]-g[i]+Mod)%Mod;
	}
	for(rg int i=1;i<=L;++i){
		for(rg int j=1;j<=n;++j)S[j]=F[j][i]*mod+G[j][i];
		std::sort(S+1,S+n+1);
		int t=0;
		for(rg int j=1;j<=n;++j)
			if(S[j]==S[j-1])ans+=t++;
			else t=1;
	}
	printf("%lld\n",ans);
	return 0;
}

posted @ 2018-04-21 08:39  菜狗xzz  阅读(207)  评论(0编辑  收藏  举报