字符串哈希 入门题

字符串哈希 入门题_第1张图片
4 3 64
Fax
fax
max
mac

4

#include 
using namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)
typedef long long ll;
const int maxn=5e4+5;
const int INF=0x3f3f3f3f;
ll n,l,num,has[maxn],p[maxn],tmp[maxn],cnt,ans;
string s[maxn];
int main(){
	cin>>n>>l>>num;
	for(int i=1;i<=n;i++){
		cin>>s[i];
		has[i]=1;
		for(int j=1;j<=l;j++){
			has[i]=has[i]*12289+s[i][j-1];	//p^l+s1*p^l-1....+sl    多了的p^l都相等 
		}
	}
	p[0]=1;
	for(int i=1;i<=l;i++){
		p[i]=p[i-1]*12289;
	}
	for(int i=1;i<=l;i++){
		for(int j=1;j<=n;j++){
			tmp[j]=has[j]-s[j][i-1]*p[l-i];
		}
		sort(tmp+1,tmp+n+1);
		cnt=1;
		for(int j=2;j<=n;j++){
			if(tmp[j]==tmp[j-1])
				cnt++;
			else{
				ans+=(cnt-1)*cnt/2;
				cnt=1;
			}
				
		}
		ans+=(cnt-1)*cnt/2;	//最后3个都相等 
	}
	cout<

你可能感兴趣的:(哈希)