BZOJ3555: [Ctsc2014]企鹅QQ(字符串hash)
2015-11-07 23:19
330 查看
题目链接
题意:n个字符串长度一样,找出有多少对,字符串只有一个位置不同
解法: 删除所有字符串的某一位的字符,计算新的hash值,找到相同的。
题意:n个字符串长度一样,找出有多少对,字符串只有一个位置不同
解法: 删除所有字符串的某一位的字符,计算新的hash值,找到相同的。
#include<bits/stdc++.h> using namespace std; #define LL long long #define pb push_back #define X first #define Y second #define cl(a,b) memset(a,b,sizeof(a)) typedef pair<int,int> P; const int maxn=30005; const int inf=1<<27; const int base=175;//随机选,不会让hash重复就好 int n,m,x; LL ans; char s[maxn]; LL a[maxn],sum[maxn][250],power[250]; void cal(int pos){ for(int i=0;i<n;i++){ a[i]=sum[i][m]-sum[i][pos]*power[m-pos]+sum[i][pos-1]*power[m-pos+1]; } sort(a,a+n); LL t=0; for(int i=0;i<n;i++){//C(n,2)==n*(n-1)/2==1+2+3+...+n-1 if(i==0||a[i]!=a[i-1])t=-1; t++; ans+=t; } } int main(){ scanf("%d%d%d",&n,&m,&x); power[0]=1; for(int i=1;i<250;i++)power[i]=power[i-1]*base; for(int i=0;i<n;i++){ scanf("%s",&s[1]); for(int j=1;j<=m;j++){ sum[i][j]=sum[i][j-1]*base+s[j]; } } for(int i=1;i<=m;i++){ cal(i); } printf("%lld\n",ans); return 0; }
相关文章推荐
- 字符串删除指定字符
- ZOJ 2966 最小生成树(B)
- line-hight-(行高)解析
- 交换某个类里面的方法
- c++调用ado执行带参数的sql(非存储过程)
- CSS 属性 overflow 深入理解学习笔记
- 在动作栏(Action Bar)中添加和删除选项卡
- Linux(centOS)上的mysql 1130连接错误
- HQL语句大全(转载)
- 如何操作笔记本显得逼格很高?
- iftop、ifstat详解
- ubuntu14.04忽然不能登录,输入密码一直返回登录界面
- python之函数用法fromkeys()
- 黑马程序员——java基础---IO(上)
- 强制加载库
- C++ sstream 中处理字符串
- CSS盒子模型
- hdu 4467 Graph 阀值
- ZOJ 2965 模拟 (A)
- android 动画 amintorset 的使用