我只想到了转化成图求染色方案
然后后来ydc大爷说这个是论文题。。
原来是弦图啊!!
#include<cstdio>
#include<iostream>
#include<set>
#include<cstring>
#include<set>
#include<map>
using namespace std;
const
int mod=1000000007;
char S[5000001];
char c;
int len;
int lmax;
int p[5000001];
int f[2000001];
int t[2000001];
int find(int x){return f[x]=(f[x]==x?x:find(f[x]));}
inline void Union(int x,int y){f[find(x)]=find(y);}
int Opt[2000001];
struct P
{
int a,b;
friend bool operator <(P a,P b)
{
return a.a<b.a||(a.a==b.a&&a.b<b.b);
}
};
set<P>T;
int main()
{
int n=0;
S[len++]='*';
while(true)
{
do c=getchar();while(c!=EOF&&(c<'a'||c>'z'));
if(c==EOF)
break;
S[len++]=c;
S[len++]='*';
n++;
}
for(int i=1;i<=n;i++)
f[i]=i;
int mid=0;
p[0]=0;
int lenx=0;
for(int i=1;i<len;i++)
{
if(i<lenx)
p[i]=min(p[(mid<<1)-i],lenx-i);
while(i-p[i]+1&&i+p[i]<len&&S[i+p[i]]==S[i-p[i]])
{
if(S[i+p[i]]!='*')
Union((i+1+p[i])>>1,(i+1-p[i])>>1);
p[i]++;
}
p[i]--;
if(lenx<i+p[i])
lenx=i+p[i],mid=i;
}
int con=0;
for(int i=1;i<=n;i++)
{
if(f[i]==i)
Opt[i]=++con;
}
P tp;
for(int i=1;i<len;i++)
if(i-p[i]-1>0&&i+p[i]+1<len)
{
tp.a=Opt[find((i-p[i])>>1)];
tp.b=Opt[find((i+p[i]+2)>>1)];
if(tp.a>tp.b)swap(tp.a,tp.b);
if(!T.count(tp))
t[tp.b]++,T.insert(tp);
}
long long ans=1;
for(int i=1;i<=con;i++)
ans*=26-t[i],ans%=mod;
printf("%lld\n",ans);
}