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 ;
}