P3370 【模板】字符串哈希 0pts 玄关求调
  • 板块学术版
  • 楼主M_Jun
  • 当前回复4
  • 已保存回复4
  • 发布时间2025/1/19 16:26
  • 上次更新2025/1/19 19:06:58
查看原帖
P3370 【模板】字符串哈希 0pts 玄关求调
1098953
M_Jun楼主2025/1/19 16:26

rt,link. 代码如下:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>

using namespace std ;

typedef long long lint ;
typedef long double dint ;
typedef unsigned long long ulint ;
struct Node {
	lint l ;
	lint r ;
} ;

const ulint P = 1e9 + 7 ; // 大质数(想开多少开多少)
const ulint MAXN = 1e5 + 5 ;

string s ;
lint ans ;
ulint cnt ;// 记录 S.size() ;
ulint n, m ;

vector<ulint> h ; // 存储哈希值的向量(前缀哈希值)
vector<ulint> p ; // 存储 P 的幂次(P 的不同次方)
vector<string> str ; // 输入的字符串
vector<Node> lr ; // 记录输入的字符串的 l 与 r

// 函数:获取区间[l, r]的哈希值
ulint get(ulint l, ulint r) {
	return h[r] - h[l - 1] * p[r - l + 1] ;
}

signed main() {
	
	// vector 初始化
	h.resize(MAXN, 0) ;
	p.resize(MAXN, 0) ;
	str.resize(MAXN, "") ;
	lr.resize(MAXN, (Node){0, 0}) ;
	p[0] = 1 ;
	
	// 输入
	cin >> n ;
	for (ulint i = 1 ; i <= n ; i ++) {
		getline(cin, str[i]) ;
		s += str[i] ;
		lr[i].l = cnt + 1 ;
		cnt += str[i].size() ;
		lr[i].r = cnt + 1 ;
	}
	
	// 哈希和幂初始化
	for (ulint i = 1 ; i <= n ; i ++) {
		h[i] = h[i - 1] * P + s[i] ;
		p[i] = p[i - 1] * P ;
	}
	
	// 输出(比较子串)
	for (lint i = 1 ; i <= n ; i ++) 
		for(lint j = i + 1 ; j <= n ; j ++) {
			if (get(lr[i].l, lr[i].r) != get(lr[i].l, lr[i].r))
				ans ++ ;
		}
	
	cout << ans << '\n' ;
	
	return 0 ;
}
2025/1/19 16:26
加载中...