首页 > 其他分享 >P3435 [POI2006] OKR-Periods of Words

P3435 [POI2006] OKR-Periods of Words

时间:2024-04-04 16:34:37浏览次数:20  
标签:后缀 ll POI2006 char while Periods 公共 P3435 getchar

原题链接

题解

1.Q是S的前缀
2.Q!=S
3.S是QQ的前缀,且S可以等于QQ
4.从S中挖掉Q后剩下的部分与Q(s)的前半部分重合,也就是公共前后缀
5.要让Q尽可能长,就要让公共前后缀尽可能短(非零)

细节请看代码
解答一些疑惑:为什么不能直接求最短公共前后缀,而是要先求最大公共前后缀?

code

#include<bits/stdc++.h>
using namespace std;

#define ll long long

char s[1000005];
ll sps[1000005]={0};

inline void read(ll &x) {
    x = 0;
    ll flag = 1;
    char c = getchar();
    while(c < '0' || c > '9'){
        if(c == '-')flag = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9') {
        x = (x << 3) + (x << 1) + (c ^ 48);
        c = getchar();
    }
    x *= flag;
}

inline void write(ll x)
{
    if(x < 0){
        putchar('-');
        x = -x;
    }
    if(x > 9)
        write(x / 10);
    putchar(x % 10 + '0');
}

int main()
{
    ll n;
    read(n);
    scanf("%s", s+1); // Keeping scanf for string input as it's not specified to change

    ll it=0;
    for(ll i=2;i<=n;i++)
    {
        while(it&&s[it+1]!=s[i]) it=sps[it];
        if(s[it+1]==s[i]) sps[i]=++it;
    }

    ll ans=0;

    for(ll i=2;i<=n;i++)
    {
        ll it=i;
        while(sps[it]) it=sps[it];
        if(it<sps[i]) sps[i]=it;//记忆化
        ans+=i-it;
    }
    write(ans);
    return 0;
}

标签:后缀,ll,POI2006,char,while,Periods,公共,P3435,getchar
From: https://www.cnblogs.com/pure4knowledge/p/18114288

相关文章

  • p3435-solution
    P3435Solutionlink画个图:显然四个黄色部分是相等的。也就是说,黄色部分是A的一个border。根据题目,周期的长度也就是Q的长度,也就是A的长度减去它的某个border的长度。现在要求这个最大,由于A的长度固定,要求的也就是A的最小border长度。根据KMP求出来的nxt......
  • CF351D - Jeff and Removing Periods 题解
    首先做一点显然的转化:在进行第一次操作之后,可以将相同的数排在一起,这样一次就能删掉一种数。如果一开始就能删光一种数的话,那么次数就是区间颜色数,否则就是区间颜色数\(+1\)。所以现在原问题变成了两个问题:求区间内不同颜色数,判断区间内是否有某种颜色满足其出现位置构成等差数......
  • P3435
    P3435设\(Q=a[1,i]\),左端绿色虚线终点为j则\(a[1,j]==a[i+1,n]\),因为他们位于Q的相同位置联想到kmp的next数组\(len_Q=n-next[j]\)只要找到最小的且非0的\(next[j]\)就可以最大化\(len_Q\)类似失配时的操作,递归找j对应的最小next......
  • CF351D Jeff and Removing Periods
    https://www.luogu.com.cn/problem/CF351D由于每次操作后存在重排操作,我们可以让序列(询问的区间)中的相同值放在一块,这样以后每次操作就能删掉一整个值相同的位置了。那么第二次操作后所需操作数就是当前序列中不同数的个数。经典数颜色问题,离线线段树/莫队/主席树都能做。数颜色......
  • OKR-Periods of Words
    对任意一个符合条件的周期\(Q\),设长度为\(l\),设字符串的长度为\(s\),则一定有\(s-l\)是\(next\)的候选项这个画个图就明白了由于题目要让\(l\)最大,所以我们用类似递归的方法即可,具体见代码,注意好好看看,特别是边界问题提醒一下,蓝书P75说一个字符串的任意循环元的长度一定是最小循......
  • A Tour Through TREE_RCU's Expedited Grace Periods (翻译)
    原文:https://www.kernel.org/doc/html/latest/RCU/Design/Expedited-Grace-Periods/Expedited-Grace-Periods.htmlATourThroughTREE_RCU'sExpeditedGracePeriods通过TREE_RCU的加速宽限期进行一次旅行Introduction引言ThisdocumentdescribesRCU'sexpeditedgracep......
  • 关于Kubernetes-v1.23-pod-生命周期-postStart-preStop-terminationGracePeriodSecond
    我们在一个pod的yaml配置文件中,有时会看到,terminationGracePeriodSeconds选项,与containers:同级,一般可以放于spec:下面即可是当pod,变为删除的状态后,会给pod一个宽限期,让pod去执行一些清理或者销毁操作另外还有两个选项,postStart,preStop,这两个是位于lifecycle,属于pod生命周期......
  • [POI2006] TET-Tetris 3D
    题目链接1、题目链接2注意到这道题本质就是一个矩形求和矩形赋值的操作。其中满足:对于任意一个点,每次赋予的权值是单调递增的。这看起但就像是一个二维线段树能做的范畴。但是众所周知,二维线段树的外层无法进行标记上传操作(无法pushup),故而这题我们考虑标记永久化。同时,为了简化......
  • k8s timeoutSeconds无效且没有按照periodSeconds的间隔时间来执行健康检查
    健康检查日志没有严格按照periodSeconds间隔时间来打印。核心代码如下: pkg/kubelet/prober/worker.gopkg/kubelet/prober/prober.gorunProbe方法(kubelet健康检查有3种方式)httpGet发送HTTP请求,返回码介于200~400之间(前闭后开)时检查成功。exec容器中执行命令,当命令执行成功......
  • Luogu P3435 [POI2006] OKR-Periods of Words
    [POI2006]OKR-PeriodsofWords题面翻译对于一个仅含小写字母的字符串\(a\),\(p\)为\(a\)的前缀且\(p\nea\),那么我们称\(p\)为\(a\)的proper前缀。规定字符串\(Q\)(可以是空串)表示\(a\)的周期,当且仅当\(Q\)是\(a\)的proper前缀且\(a\)是\(Q+Q\)的前缀......