UVA 12206 - Stammering Aliens(Hash+LCP)

来源:互联网 发布:大逃杀新手知乎 编辑:程序博客网 时间:2024/05/17 12:49

UVA 12206 - Stammering Aliens

题目链接

题意:给定一个字符串,找出重复出现超过m次的字串的最大开始下标

思路:hash大法,需要点人品,然后二分答案,每次利用hash值去找出最大下标即可

代码:

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef unsigned long long ull;const ull x = 123;const int N = 40005;int m, n;char str[N];ull H[N], Hp[N];void gethash() {    H[n] = 0;    for (int i = n - 1; i >= 0; i--)H[i] = H[i + 1] * x + str[i] - 'a';}struct Suf {    int hash, id;} suf[N];bool cmp(Suf a, Suf b) {    if (a.hash == b.hash) return a.id < b.id;    return a.hash < b.hash;}int find(int L) {    for (int i = 0; i < n - L + 1; i++) {suf[i].hash = H[i] - H[i + L] * Hp[L];suf[i].id = i;    }    sort(suf, suf + n - L + 1, cmp);    int ans = -1;    for (int i = 0; i < n - L + 1; i++) {int j, len = 0;for (j = i; suf[i].hash == suf[j].hash && j < n - L + 1; j++)    len++;if (len >= m) {    ans = max(ans, suf[j - 1].id);}i = j - 1;    }    return ans;}void solve() {    if (find(1) == -1) printf("none\n");    else {int l = 1, r = n - m + 2;while (l < r) {    int mid = (l + r) / 2;    if (find(mid) == -1) r = mid;    else l = mid + 1;}printf("%d %d\n", l - 1, find(l - 1));    }}int main() {    Hp[0] = 1;    for (int i = 1; i < N; i++)Hp[i] = Hp[i - 1] * x;    while (~scanf("%d", &m) && m) {scanf("%s", str);n = strlen(str);gethash();solve();    }    return 0;}


1 1
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 税务局让法人缴税法人不缴会怎么办 税盘忘记清卡怎么办 7年没申报地税怎么办 已报税忘了清卡怎么办 国税报税密码忘了怎么办 有一个月忘报税了怎么办 地税报税密码忘了怎么办 电子税务账号忘记了怎么办 国税ukey密码忘了怎么办 电子税务局显示版本低怎么办 电子税务局2.0不显示打印怎么办 青海建筑三级资质初申是怎么办 欠钱败诉没钱还怎么办 学校退款卡丢了怎么办 学校发的卡掉了怎么办 汇款回执单丢了怎么办 大学交学费的卡丢了怎么办 交学费的银行卡丢了怎么办 学校补助卡丢了怎么办 学校交学费的卡丢了怎么办 采购零星材料无发票怎么办 租房合同弄丢了怎么办 买房的合同丢了怎么办 押金的收据丢了怎么办 房东的合同掉了怎么办 个人档案里单位没有放合同怎么办 签的合同掉了怎么办 一方合同弄丢了怎么办 合同丢了怎么办如何补 签了定金合同对方违约怎么办 医学出生证明丢了怎么办 易通行出站未刷怎么办 炭烧酸奶过期了怎么办 西安建行etc坏了怎么办 电机在设备壳体中拔不出来怎么办 公司变更股东不能亲临现场怎么办? 公司股东变更老股东不签字怎么办 公司变更地址股东不签字怎么办 公司变更股份股东不签字怎么办 公司股东离职股东没变更过来怎么办 河南省宋基投资公司欠钱怎么办