先Hash一下。
删掉某一位,重新Hash,然后排序,扫一遍就好了。
感觉人品用光了,数组大小205打成25,WA了4次。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=30000+5; typedef unsigned long long ll; ll hash1[N][205],hash2[N][205],rehash[N]; int n,l,s; char ch[205]; void calc(int x){ for(int i=1;i<=l;i++) hash1[x][i]=hash1[x][i-1]*233+ch[i]; for(int i=l;i>=1;i--) hash2[x][i]=hash2[x][i+1]*213+ch[i]; } int main(){ scanf("%d%d%d",&n,&l,&s); for(int i=1;i<=n;i++){ scanf("%s",ch+1); calc(i); } int ans=0; for(int i=1;i<=l;i++){ for(int j=1;j<=n;j++) rehash[j]=hash1[j][i-1]*741+hash2[j][i+1]*886; sort(rehash+1,rehash+1+n); int now=1; for(int i=2;i<=n;i++) if(rehash[i]==rehash[i-1])ans+=now,now++; else now=1; } printf("%d",ans); return 0; }