怕是CTSC中最简单的一道题了吧。
用哈希存一个前缀,一个后缀,再枚举哪一位不相同,再判一下即可。
#include<bits/stdc++.h>
using namespace std;
unsigned long long H[30005][205],G[30005][205],tmp[30005];
int n,m,opt,ans,now;
char s[205];
void init(int i)
{
for(int j=1;j<=m;j++)
H[i][j]=H[i][j-1]*233+s[j];
for(int j=m;j>=1;j--)
G[i][j]=G[i][j+1]*217+s[j];
}
int main()
{
///freopen("in.txt","r",stdin);
scanf("%d%d%d\n",&n,&m,&opt);
for(int i=1;i<=n;i++)
{
scanf("%s\n",s+1);
init(i);
}
for(int j=1;j<=m;j++)
{
for(int i=1;i<=n;i++)
tmp[i]=H[i][j-1]*149+G[i][j+1]*247;
sort(tmp+1,tmp+n+1);
now=1;
for(int i=2;i<=n;i++)
if(tmp[i-1]==tmp[i])ans+=now,now++;
else now=1;
}
cout<<ans;
return 0;
}