回文自动机
我只是想敲个板子复习一下啦……
一个串的本质不同回文子串最多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();
}