您的位置:首页 > 其它

URAL 2040 (回文自动机)

2016-08-07 22:02 260 查看
Problem Palindromes and Super Abilities 2 (URAL2040)

题目大意

  给一个字符串,从左到右依次添加,询问每添加一个字符,新增加的回文串数量。

解题分析

  用回文自动机来做,如果新添加了一个字符,自动机中新开了一个节点,说明新增加了一个回文串。

  对于每新添加一个字符,新增加的回文串数量最多为1。

  另外,这道题既卡空间又卡时间,交了n发才过。

参考程序

#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <string>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#pragma comment(linker,"/STACK:102400000,102400000")
using namespace std;

#define     N             5000008
#define     V             1008
#define        E            60008
#define        lson        l,m,rt<<1
#define     rson        m,r+1,rt<<1|1
#define        clr(x,v)    memset(x,v,sizeof(x));
#define        LL            long long

const int    mo    =    1000000007;
const int     inf =    0x3f3f3f3f;
const int     INF =    2000000000;
/**************************************************************************/
int n,cnt,last;
int nt
[2],size
,len
,fail
;
char s
;

void init(){
fail[0]=fail[1]=1;
len[1]=-1;
last=0; cnt=1;
}
void insert(int c,int n){
int p=last;
while (s[n-len[p]-1]!=s
) p=fail[p];
if (!nt[p][c]){
int now=++cnt,k=fail[p];
len[now]=len[p]+2;
while (s[n-len[k]-1]!=s
) k=fail[k];
fail[now]=nt[k][c]; nt[p][c]=now;
putchar('1');
}
else putchar("0");
last=nt[p][c];
size[last]++;
}

void solve(){
for (int i=cnt;i>=1;i--) size[fail[i]]+=size[i];
}
int main(){
gets(s+1);
init();
n=strlen(s+1);
for (int i=1;i<=n;i++) insert(s[i]-97,i);
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: