标签:
Time Limit: 20 Sec
Memory Limit: 256 MB
http://www.lydsy.com/JudgeOnline/problem.php?id=3555
Input
第一行包含三个正整数 , , 。其中 表示账户名称数量, 表示账户名称长度, 用来表示字符集规模大小,它的值只可能为2或64。
若 等于2,账户名称中只包含字符‘0’和‘1’共2种字符;
若 等于64,账户名称中可能包含大小写字母、数字、下划线以及‘@’共64种字符。
随后 行,每行一个长度为 的字符串,用来描述一个账户名称。数据保证 个字符串是两两不同的。
Output
仅一行一个正整数,表示共有多少对相似的账户名称。
Sample Input
4 3 64
Fax
fax
max
mac
Sample Output
4
题意
题解:
直接暴力hash就好了,枚举哪一位不一样就行了……
不要想多了
代码
#include<iostream> #include<stdio.h> #include<algorithm> #include<vector> using namespace std; long long N=1000000007; long long p=149; long long powp[305*4]; int num,n,k; void get_hash(long long h[],char str[]) { h[0]=(long long)str[0]; for(int i=1;i<n;i++) h[i]=(h[i-1]*p+(long long)str[i]); } char s[30005][205]; long long h[30005][205]; int main() { scanf("%d%d%d",&num,&n,&k); vector<long long> Q; powp[0]=1LL; for(int i=1;i<=n;i++) powp[i]=powp[i-1]*p; for(int i=0;i<num;i++) { scanf("%s",s[i]); get_hash(h[i],s[i]); } long long ans = 0; for(int i=0;i<n;i++) { Q.clear(); for(int j=0;j<num;j++) { long long p = h[j][n-1]-h[j][i]*powp[n-i-1]+h[j][i-1]*powp[n-i]; Q.push_back(p); } sort(Q.begin(),Q.end()); int tmp = 0; for(int j=0;j<num;j++) { if(j==0||Q[j]!=Q[j-1]) tmp=-1; tmp++; ans += tmp; } //cout<<ans<<endl; } printf("%lld\n",ans); }
BZOJ 3555: [Ctsc2014]企鹅QQ hash
标签:
原文地址:http://www.cnblogs.com/qscqesze/p/4936849.html