链接:https://ac.nowcoder.com/acm/contest/884/I
题意:求string串有多少个本质不同的子串,且这些子串之间两两不存在 a==rev(a),即不存在长度1以上的回文串
题解:
要算string 和 rev(string)的所有子串,对string
和rev(string)建立广义后缀自动机,则理论上所有子串增加了一倍,但实际回文串和 不是回文但a == rev(a)的串没有增加,
比如 aba子串ab和ba。则我们计算出此时不同串个数 ans1, 再计算出string串中回文串数 ans2,则(ans1+ans2)/2即为所求.
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 2*1e6+5;
const int maxc = 28;
char str[maxn];
struct SMA{
int len[maxn * 2];
int link[maxn * 2];
int cnt[maxn * 2];
int nxt[maxn * 2][maxc];
int idx;
int last;
LL epos[maxn * 2];
LL a[maxn];
void init(){
last = idx = 1;
link[1] = len