HDOJ 5421 Victor and String 回文串自己主动机

Posted cxchanpin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDOJ 5421 Victor and String 回文串自己主动机相关的知识,希望对你有一定的参考价值。


假设没有操作1,就是裸的回文串自己主动机......


能够从头部插入字符的回文串自己主动机,维护两个last点就好了.....

当整个串都是回文串的时候把两个last统一一下

Victor and String

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/262144 K (Java/Others)
Total Submission(s): 30    Accepted Submission(s): 9


Problem Description
Victor loves to play with string. He thinks a string is charming as the string is a palindromic string.

Victor wants to play  times. Each time he will do one of following four operations.

Operation 1 : add a char  to the beginning of the string.

Operation 2 : add a char  to the end of the string.

Operation 3 : ask the number of different charming substrings.

Operation 4 : ask the number of charming substrings, the same substrings which starts in different location has to be counted.

At the beginning, Victor has an empty string.
 

Input
The input contains several test cases, at most  cases.

In each case, the first line has one integer  means the number of operations.

The first number of next  line is the integer , meaning the type of operation. If = or , there will be a lowercase English letters followed.

.
 

Output
For each query operation(operation 3 or 4), print the correct answer.
 

Sample Input
6 1 a 1 b 2 a 2 c 3 4 8 1 a 2 a 2 a 1 a 3 1 b 3 4
 

Sample Output
4 5 4 5 11
 

Source
 


/* ***********************************************
Author        :CKboss
Created Time  :2015年08月24日 星期一 10时32分04秒
File Name     :HDOJ5421.cpp
************************************************ */

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>

using namespace std;

typedef long long int LL;

const int maxn=200100;
const int C=30;

int L,R;
int nxt[maxn][C];
int fail[maxn];
LL cnt[maxn];
LL num[maxn];
int len[maxn];
int s[maxn];
int last[2],p,n;
LL tot;

int newnode(int x)
{
	for(int i=0;i<C;i++) nxt[p][i]=0;
	num[p]=0; len[p]=x;
	return p++;
}

void init()
{
	p=0;
	newnode(0); newnode(-1);

	memset(s,-1,sizeof(s));
	L=maxn/2; R=maxn/2-1;
	last[0]=last[1]=0;
	fail[0]=1;

	tot=0;
}

/// d=0 add preffix d=1 add suffix

int getfail(int d,int x)
{
	if(d==0) while(s[L+len[x]+1]!=s[L]) x=fail[x];
	else if(d==1) while(s[R-len[x]-1]!=s[R]) x=fail[x];
	return x;
}

void add(int d,int c)
{
	c-=‘a‘;
	if(d==0) s[--L]=c;
	else s[++R]=c;

	int cur=getfail(d,last[d]);

	if(!nxt[cur][c])
	{
		int now=newnode(len[cur]+2);
		fail[now]=nxt[getfail(d,fail[cur])][c];
		nxt[cur][c]=now;
		num[now]=num[fail[now]]+1;
	}
	last[d]=nxt[cur][c];
	if(len[last[d]]==R-L+1) last[d^1]=last[d];
	tot+=num[last[d]];
}

int main()
{
	//freopen("in.txt","r",stdin);
	//freopen("out.txt","w",stdout);

	int _;
	while(scanf("%d",&_)!=EOF)
	{
		init();
		while(_--)
		{
			int kind;
			char ch[5];
			scanf("%d",&kind);
			if(kind<=2)
			{
				kind--;
				scanf("%s",ch);
				add(kind,ch[0]);
			}
			else if(kind==3) printf("%d\n",p-2);
			else if(kind==4) printf("%lld\n",tot);
		}
	}
    
    return 0;
}



以上是关于HDOJ 5421 Victor and String 回文串自己主动机的主要内容,如果未能解决你的问题,请参考以下文章

HDU - 5421:Victor and String (回文树,支持首尾插入新字符)

HDOJ 5418 Victor and World 状压DP

Victor and String[Bestcoder #52 1004](回文树)

codeforces 460D:Little Victor and Set

HDU 5418 Victor and World 允许多次经过的TSP

Codeforces 460 D. Little Victor and Set