Ural 2040 Palindromes and Super Abilities 2

回文自动机

我只是想敲个板子复习一下啦……

一个串的本质不同回文子串最多n个,因为新加一个字符的时候至多增加一个回文串,用border证即可。

好像BZOJ已经陷入了无法评测的境地......好气啊

#include<cstdio>
#include<cstring>
#define N 5000005
#define A 2
using namespace std;
namespace runzhe2000
{
    char s[N], out[N];
    struct PT
    {
        PT *fail, *next[A];
        int len;
    }mem[N], *tot, *null, *root1, *root0, *last;
    PT *newPT()
    {
        PT *p = ++tot;
        *p = *null; return p;
    }
    void init()
    {
        null = tot = mem;
        null->fail = null;
        for(int i = 0; i < A; i++) null->next[i] = null;
        null->len = 0;
        root1 = newPT(); root1->fail = root1; root1->len = -1;
        root0 = newPT(); root0->fail = root1; last = root1;
    }
    int extend(int c, int i)
    {
        PT *p = last;
        for(; s[i-p->len-1] != c+'a'; p = p->fail);
        if(p->next[c] != null) {last = p->next[c]; return 0;}
        PT *np = p->next[c] = last = newPT(); np->len = p->len + 2;
        if(p->len == -1) np->fail = root0;
        else 
        {
            for(p=p->fail; s[i-p->len-1] != c+'a'; p = p->fail);
            np->fail = p->next[c];
        }
        return 1;
    }
    void main()
    {
        scanf("%s",s+1); init();
        for(int i = 1, ii = strlen(s+1); i <= ii; i++)
            out[i] = extend(s[i]-'a', i)?'1':'0';
        puts(out+1);
    }
}
int main()
{
    runzhe2000::main();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值