1 条题解
-
1
枚举+哈希
枚举
因为l<=200,可以枚举字符不同的位置,记为i,再将每个数第i位去掉形成一个新的字符串。
哈希
如果暴力判断两两相同的字符,n方会超时。考虑将字符串哈希一下存到map里,每次
ans += mp[t];坑点
记得用
unordered_map,用map会超时60分(亲测x_x)code
#include <bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long long namespace syr { const ll N = 3e4+10; const ll L = 210; const ull M = 13331; char c; ll n, l, k, ans; ull a[N][L], f[N]; unordered_map <ull, ll> mp; void work() { cin>>n>>l>>k; f[0] = 1; for (ll i=1; i<=n; i++) f[i]=f[i-1]*M; for (ll i=1; i<=n; i++) { for (ll j=1; j<=l; j++) { cin>>c; a[i][j] = a[i][j-1]*M+(c-'0'+1)*M; } } for (ll i=1; i<=l; i++) { //不同的位置 mp.clear(); for (ll j=1; j<=n; j++) { ull t = a[j][i-1]*f[l-i]+a[j][l]-a[j][i]*f[l-i]; ans += mp[t]; mp[t]++; } } cout<<ans; } } int main() { cin.tie(0)->sync_with_stdio(0); syr::work(); return 0; }Ps:
- 工具[T] —— 编译选项[C] —— 编译器 —— (勾选)编译时加入以下命令 —— 输入
-std=c++14
完结散花!
- 工具[T] —— 编译选项[C] —— 编译器 —— (勾选)编译时加入以下命令 —— 输入
- 1
信息
- ID
- 157
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- (无)
- 递交数
- 40
- 已通过
- 12
- 上传者