记录编号 162130 评测结果 AAAAAAAAAAAAAAAAAAAAAA
题目名称 [ONTAK 2010] 回文等价 最终得分 100
用户昵称 Gravatar天一阁 是否通过 通过
代码语言 C++ 运行时间 2.393 s
提交时间 2015-05-14 09:56:24 内存使用 80.42 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <set>
#include <vector>

#define N 2000010
#define A 26
#define LL long long
#define mod 1000000007LL

using namespace std;

void file(){
	//freopen("test.in","r",stdin);
	freopen("palindromic.in","r",stdin);
	freopen("palindromic.out","w",stdout);
}

set<int> D[N];
vector<int> G[N];
int ansv,fa[N];

int find(int x){
	if(fa[x]!=x) fa[x]=find(fa[x]);
	return fa[x];
}

void unionn(int x,int y){
	int r1=find(x);
	int r2=find(y);
	if(r1!=r2) fa[r2]=r1;
}

namespace PT{
	struct node{
		node *ch[A],*fail;
		int len;
	}*root[2],*now;
	
	int n,tot_n;
	char S[N];
	
	node* get_node(int x){
		node* tmp=new node();
		tmp->len=x;
		return tmp;
	}
	
	void init(){
		n=0;
		root[0]=get_node(-1);
		root[1]=get_node(0);
		root[1]->fail=root[0]->fail=root[0];
		now=root[1];
		S[n++]=-1;
	}
	
	node* get(node* p){
		while(S[n-p->len-2]!=S[n-1]){
			int tmp=n-p->len-2;
			if(tmp>0) G[n-1].push_back(tmp);
			p=p->fail;
		}
		unionn(n-p->len-2,n-1);
		node* tmp=p;
		return p;
	}
	
	int addin(char c){
		int t=c-'a'; S[n++]=c;
		node* p=get(now);
		if(!p->ch[t]){
			now=get_node(p->len+2);
			if(now->len==1) now->fail=root[1];
			else now->fail=get(p->fail)->ch[t];
			p->ch[t]=now;
		}
		now=p->ch[t];
		return now->len;
	}
};

int n;
char S[N];

int main(){
	file();
	scanf("%s",S);
	n=strlen(S);
	PT::init();
	for(int i=0;i<=n;i++) fa[i]=i;
	for(int i=0;i<n;i++) PT::addin(S[i]);
	LL ans=1;
	for(int x=1;x<=n;x++){
		int t=find(x);
		for(int i=G[x].size()-1;~i;i--){
			int p=find(G[x][i]);
			if(p<t) D[t].insert(p);
		}
	}
	for(int i=1;i<=n;i++){
		if(find(i)!=i) continue;
		ans=ans*(26-D[i].size())%mod;
	}
	printf("%lld\n",ans);
	return 0;
}