码迷,mamicode.com
首页 > 其他好文 > 详细

[CTSC2014]企鹅QQ

时间:2018-11-04 23:02:49      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:思考   ++   def   include   不能   去掉   不同   init   ret   

题意

Here

思考

这其实是一道哈希模板题,题目定义“相似串”:两字符串只有一处不同。

很容易想到哈希,我们枚举每一位,将该位的哈希值删除后重新比较两串即可,主要实现也很简单,主要类比进制就好了。(\(ps\) :我再也不相信单模数哈希了),如何记录答案?肯定不能 \(n^2\) 记录啦,将去掉某位的哈希值排序,再顺着扫一遍即可,具体细节见代码

代码

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll base = 131;
char s[30030][205];
ll S, ans, B[30030], H[30030][205], n, len, cnt, tmp[30030];
void init(){
    B[0] = 1;
    for(int i=1; i<=len; i++) B[i] = (B[i-1] * base);
    for(int i=1; i<=n; i++){
        for(int j=1; j<=len; j++){
            H[i][j] = (H[i][j-1] * base + s[i][j]);
        }
    }
}
int main(){
    cin >> n >> len >> S;
    for(int i=1; i<=n; i++){
        cin >> s[i] + 1;
    }
    init();
    for(int j=1; j<=len; j++){
        for(int i=1; i<=n; i++){
            tmp[i] = H[i][j-1] * B[len-j] + H[i][len] - H[i][j] * B[len-j];
        }
        sort(tmp+1, tmp+n+1);
        int sum = 1;
        for(int i=1; i<=n; i++){
            if(tmp[i] == tmp[i-1]) ans += sum, sum ++;
            else sum = 1;
        }
    }
    cout << ans;
    return 0;
}

总结

以后自然溢出/最好双哈希

[CTSC2014]企鹅QQ

标签:思考   ++   def   include   不能   去掉   不同   init   ret   

原文地址:https://www.cnblogs.com/alecli/p/9906113.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!