首页 > 其他 > 详细

【BZOJ 3790】 神奇项链

时间:2018-07-01 12:21:19      阅读:202      评论:0      收藏:0      [点我收藏+]

【题目链接】

            https://www.lydsy.com/JudgeOnline/problem.php?id=3790

【算法】

          manacher + 贪心

【代码】

          

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

char s[MAXN];

struct info
{
        int l,r;
};
inline bool cmp(info a,info b)
{
        return a.l != b.l ? a.l < b.l : a.r > b.r;
}
inline void Manacher()
{
        int i,len,pos = 0,mx = 0,n = 0,ans,r;
        static int p[MAXN<<1];
        static char tmp[MAXN<<1];
        static info a[MAXN<<1];
        len = strlen(s+1);        
        for (i = 1; i <= len; i++)
        {
                tmp[2*i-1] = #;
                tmp[2*i] = s[i];
        }
        tmp[len = 2 * len + 1] = #; 
        for (i = 1; i <= len; i++)
        {
                if (mx > i) p[i] = min(p[2*pos-i],mx-i);
                else p[i] = 1;
                while (i - p[i] >= 1 && i + p[i] <= len && tmp[i-p[i]] == tmp[i+p[i]]) p[i]++;
                if (i + p[i] - 1 > mx)
                {
                        mx = i + p[i] - 1;
                        pos = i;
                }
        } 
        for (i = 1; i <= len; i++) a[++n] = (info){i-p[i]+1,i+p[i]-1};
        sort(a+1,a+n+1,cmp);
        r = a[1].r; ans = 1; pos = 2;
        while (r < len)
        {
                mx = r;
                while (pos <= n && a[pos].l <= r + 1) 
                {    
                        mx = max(mx,a[pos].r);
                        pos++;
                }
                ans++; 
                r = mx;
        }
        printf("%d\n",ans-1);
}

int main() 
{
        
        while (scanf("%s",s+1) != EOF) Manacher();
        
        return 0;
    
}

 

【BZOJ 3790】 神奇项链

原文:https://www.cnblogs.com/evenbao/p/9249765.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!