ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[BZOJ3790] 神奇项链 - Manacher,贪心

2020-07-10 21:40:07  阅读:218  来源: 互联网

标签:机器 前缀 BZOJ3790 int Manacher 字符串 回文 贪心


Description

两个机器。第一个机器可以生成所有形式的回文串,第二个机器可以把两个回文串连接起来,而且第二个机器还有一个特殊的性质:假如一个字符串的后缀和一个字符串的前缀是完全相同的,那么可以将这个重复部分重叠。给定一个字符串,询问你需要使用第二个机器多少次才能生成这个特殊的字符串。

Solution

首先我们用 Manacher 处理出每个位置为中心的最长回文半径 \(p_i\),并计算出 \(l_i\)(首先对任意 \(i\),令 \(l[i+p_i-1] \leftarrow p_i\),然后从左往右扫一遍 \(l[i]=\max(l[i],l[i-2]-2)\))

预处理出一个前缀中的所有起点可以到达的最远位置 \(g[i]=\max(g[i-1],i+l[i]-1)\)

考虑贪心,假设当前已经生成了长度为 \(i\) 的前缀,则下一次跳到 \(g[i+1]\) 即可

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

#define int long long
const int N = 1000005;

int l[N],n,T,g[N];

namespace man {
const int N = 2100005;
char str[N], s[N<<1];
int a[N<<1];

int manacher(int len){
    a[0] = 0;
    int ans = 0, j;
    for(int i = 0; i < len; ){
        while(i-a[i]>0 && s[i+a[i]+1]==s[i-a[i]-1])
              a[i]++;
        if(ans < a[i])ans = a[i];
        j = i+1;
        while(j<=i+a[i] && i-a[i]!=i+i-j-a[i+i-j]){
            a[j] = min(a[i+i-j], i+a[i]-j);
            j++;
        }
        a[j] = max(i+a[i]-j, 0ll);
        i = j;
    }
    for(int i=0;i<len;i++) l[i]=0;
    for(int i=0;i<len;i++) l[i-a[i]+1]=max(l[i-a[i]+1],a[i]);
    for(int i=0;i<len;i++) l[i]=max(l[i],l[i-2]-2);
    for(int i=1;i<=len;i++) l[i]=l[i*2-1];
    for(int i=0;i<len;i++) str[i]='\0';
    return ans;
}

int solve(){
    int len;
    len = 2*strlen(str)+1;
    for(int i = 0; str[i] != '\0'; i++){
        s[i+i] = '\0';
        s[i+i+1] = str[i];
    }
    s[len-1] = '\0';
    return manacher(len);
}
}

signed main()
{
    ios::sync_with_stdio(false);
    string s;
    while(cin>>s)
    {
        n=s.length();
        for(int i=0;i<n;i++)
        {
            man::str[i]=s[i];
        }
        man::solve();
        for(int i=1;i<=n;i++) g[i]=0;
        for(int i=1;i<=n;i++) g[i]=max(g[i-1],i+l[i]-1);
        int pos=0,ans=0;
        while(pos<n)
        {
            pos=g[pos+1];
            ans++;
        }
        cout<<ans-1<<endl;
    }
}

标签:机器,前缀,BZOJ3790,int,Manacher,字符串,回文,贪心
来源: https://www.cnblogs.com/mollnn/p/13281286.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有