1. 程式人生 > >HDOJ 5421 Victor and String 回文串自己主動機

HDOJ 5421 Victor and String 回文串自己主動機

end with data- 插入 art else ack 自己 !=


假設沒有操作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 BestCoder Round #52 (div.1) ($)

/* ***********************************************
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 回文串自己主動機