码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ3555 [Ctsc2014]企鹅QQ 题解

时间:2016-08-03 20:15:53      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

题目大意:

      有一些字符串,求其中两个等长且恰好只有一位不同的字符串的对数。

思路:

      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 }

 

BZOJ3555 [Ctsc2014]企鹅QQ 题解

标签:

原文地址:http://www.cnblogs.com/HHshy/p/5734073.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!