2019HDU多校第五场 HDU 6629. string matching (扩展KMP应用//Z函数)

这道题坎扩展KMPnxt数组规律看了一会 也意识到 自己对展开kmp各种应用还是不够熟练
题意:给出一个用于求在一个给定字符串中求每一位的后缀(含自己)与这个字符串的最长相同的长度的算法,问你对于给出的字符串执行这个算***进行多少次这个算法中那个字符与字符的比较过程
扩展KMP里求NXT数组的代码跑一遍,我们就可以得到每一位的最长字串的长度,然后因为问的是比较次数,那么只要这一位的位置加上它的子串长没用超过字符串的最后一位,就说明它会在统计时还要加上一次比较次数,也就是在统计它的字串长度时它和下一位比较并且匹配失败的那一次。
nxt[i]表示T[i,len-1]与T[0,len-1]的最长公共前缀。

#include<bits/stdc++.h>
#define N 1000010
#define int long long
using namespace std;

int q, nxt[N], extend[N];
string s, t;

void getnxt() {
    nxt[0] = t.size(); //nxt[0]一定是T的长度
    int now = 0;
    while(t[now] == t[1 + now] && now + 1 < (int)t.size())
        now++;//这就是从1开始暴力
    nxt[1] = now;
    int p0 = 1;
    for(int i = 2; i < (int)t.size(); i++) {
        if(i + nxt[i - p0] < nxt[p0] + p0)
            nxt[i] = nxt[i - p0]; //第一种情况
        else {
            //第二种情况
            int now = nxt[p0] + p0 - i;
            now = max(now, 0ll); //这里是为了防止i>p的情况
            while(t[now] == t[i + now] && i + now < (int)t.size())
                now++;//暴力
            nxt[i] = now;
            p0 = i; //更新p0
        }
    }
}
signed main() {
    int cas;
    ios::sync_with_stdio(false);cin.tie(0);
    cin >>cas;
    while(cas--) {
        cin >> t;
        memset(nxt, 0, sizeof(nxt));
        getnxt();
        int len = t.size();
        int ans =0;
        for(int i = 1; i < len; i++) {
            // printf("%d ", nxt[i]); //输出nxt
            // ans ++;
            if(nxt[i]) {
                ans += nxt[i];
            }
            if(nxt[i]!=len-i) ans ++; // nxt[i] + i < len 
        }
        cout << ans << endl;
    // puts("");
    }
    return 0;
}
全部评论

相关推荐

头像
11-03 16:48
已编辑
百度_高级研发工程师
事实是检验真理的唯一标准。&nbsp;无论我们怎么去说,去讲述,去证明,都抵不过一个offer来得实在,无论我们怎么去复现求职中的摸爬滚打、扒皮抽筋、狼狈不堪,都抵不过你在简历写上大厂的名字(外包不算)。&nbsp;所以在我求职期间,我什么话都不说,什么话都不讲,因为没有意义,虽然我总讲过程才是意义,但只有当你上岸的那一刻,你才有资格回想在水里的挣扎,只有等你出了山,你才知道山的全貌。&nbsp;我为什么一定要离开华为OD,难道它不稳定吗,不能赚钱吗。为了证明自己,那肯定有的。其实更多的是印证我的认知是否真的正确。&nbsp;(给不了解我的人交代一下背景,在下双非一本,gap一年,华为OD外包,摸爬滚打4个月,艰难上岸百度正编)一、...
先锋战士:说得很真诚。鄙视链自古有之,学历,家庭背景,财富,权利。从小有之,小学羡慕那些当班委的,中学羡慕那些学生会的,高中羡慕尖子班拿教学金的,大学羡慕高绩点,毕业了羡慕进大厂的。工作了,又羡慕高职级的,再后来又羡慕别人早早结婚的。我想表达的观点很简单,无论是华为od还是百度,都是经历,没有孰高孰低,为了抵达下一个风景,总会付出更多东西,但不就是人生吗?正如登山,每个阶段的山,都要想办法攀登,在博主的文字中,见到了坚持和积极寻找问题解决办法的心态
学历对求职的影响
点赞 评论 收藏
分享
09-12 11:55
已编辑
湖南工商大学 Java
那一天的Java_J...:这种一堆问题的,别去
点赞 评论 收藏
分享
09-29 16:59
已编辑
门头沟学院 Java
牛客96609213...:疯狂背刺,之前还明确设置截止日期,还有笔试,现在一帮人卡在复筛,他反而一边开启扩招,还给扩招的免笔试,真服了,你好歹先把复筛中的给处理了再说
投递大疆等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务