题目大意:
有一些字符串,求其中两个等长且恰好只有一位不同的字符串的对数。
思路:
Hash大法好!正着倒着各来一遍(底数不同),之后枚举不同的那一位,前后两段拼起来之后为了有区分前面一部分再乘一个数。模数用unsigned long long自然溢出。
代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 const int S1=1007,S2=10007; 6 char s[210]; 7 unsigned long long l[30010][210],r[30010][210],a[30010]; 8 9 int main() 10 { 11 int n,m,op,i,j,sum=0; 12 scanf("%d%d%d",&n,&m,&op); 13 for (i=1;i<=n;i++) 14 { 15 scanf("%s",s+1); 16 for (j=1;j<=m;j++) l[i][j]=l[i][j-1]*S1+s[j]; 17 for (j=m;j>=1;j--) r[i][j]=r[i][j+1]*S2+s[j]; 18 } 19 for (i=1;i<=m;i++) 20 { 21 for (j=1;j<=n;j++) a[j]=l[j][i-1]*233+r[j][i+1]; 22 sort(a+1,a+n+1); 23 int ans=0; 24 for (j=2;j<=n;j++) 25 if (a[j]==a[j-1]) ans++,sum+=ans; 26 else ans=0; 27 } 28 printf("%d",sum); 29 return 0; 30 }
时间: 2024-10-23 10:27:57