Hash水题,枚举每一位然后hash搞一搞
听说自然溢出很快就试了一下
然后就WAWA不休
最后还是回归正常的办法:模大数字(为什么不是质数呢?因为我的两个数字是随便敲的)
#include<cstdio> #include<algorithm> #include<cstdlib> #include<cstring> using namespace std; const long long Mod1=666666666666667ll,Mod2=233333333333333ll; int n,len,x,ans=0; long long Ha_F[30005][205],Ha_L[30005][205],tp[30005]; char s[30005][205]; void Get(int x){ for(int i=1;i<=len;i++)Ha_F[x][i]=(Ha_F[x][i-1]*233+s[x][i])%Mod1; for(int i=len;i;i--)Ha_L[x][i]=(Ha_L[x][i+1]*137+s[x][i])%Mod2; } int main(){ freopen("3555.in","r",stdin); freopen("3555.out","w",stdout); scanf("%d %d %d",&n,&len,&x); for(int i=1;i<=n;i++){ scanf("%s",s[i]+1); Get(i); } for(int i=1;i<=len;i++){ for(int j=1;j<=n;j++){ tp[j]=(Ha_F[j][i-1]*Mod2+Ha_L[j][i+1]*Mod1)%(Mod2*Mod1); } sort(tp+1,tp+n+1); int cnt=1; for(int j=2;j<=n;j++){ if(tp[j]==tp[j-1])ans+=cnt,cnt++; else cnt=1; } } printf("%d\n",ans); return 0; }