回文自動機 2018 南京網路賽 Skr

2021-09-27 02:34:11 字數 1323 閱讀 8987

題意:給定乙個數字串,求每個不同回文數字串的和

也可以通過每個回文的區間+hash o1 獲得該串數字 算出答案

**為方深搜**

#include #define endl '\n'

using namespace std;

typedef long long ll;

typedef long double ld;

const int maxn = 2e6 + 100;

const int mod = 1e9 + 7;

const int inf = 1e9;

char str[maxn];

int fail[maxn],len[maxn],last,ch[maxn][11],n,num[maxn],cnt[maxn],tot,pos[maxn];

ll ans1,ans2,bas[maxn];

//len[i], 以i結尾的最長回文子串的長度

//cnt[i]:以i結尾的最長回文子串相同的子串的個數 在count後得到全部

//num[i] 表示以i結尾的回文串的種類數

//str 存放新增的字元

//fail 失配後跳轉到的不等於自身的最長字尾回文子串。

//pos 表示當前最長回文子串的結束位置

//ch 類似於字典樹,指向當前字串在兩端同時加上乙個字元

//last 最新新增的回文節點

// tot 總的節點個數

// n表示新增的字元個數

ll newnode(ll x)

void init()

ll get_fail(ll p,ll x)

void count()

void build() //構建回文樹

last = ch[tmp][s];

pos[last] = i;

cnt[last]++;

} return ;

}void dfs1(ll now,ll pre) }

return ;

}void dfs2(ll now,ll pre)

else

ans2 = (ans2+tmp)%mod;

dfs2(ch[now][i],tmp);

} }

return ;

}int main()

dfs1(0,0);

//cout << ans1 << endl;

dfs2(1,0);

cout << (ans1+ans2)%mod << endl;

return 0;

}

回文自動機

回文自動機,又叫回文樹,是由俄羅斯人 mikhailrubinchik於2014年夏發明的 這是一種比較新的資料結構,在原文中已有詳細介紹與 實現。回文樹其實不是嚴格的樹形結構,因為它有是兩棵樹,分別是偶數長度的回文樹和奇數長度的回文樹,樹中每個節點代表乙個回文串。為了方便,第一棵樹的根是乙個長度為...

回文自動機

乙個節點表示乙個回文串。tot 節點個數,即不同回文串的個數。兩棵樹,節點為0,1,所以最後計數時從2開始 n 新增的字元個數 last 新新增乙個字母後所形成的最長回文串表示的節點 nxt i c 節點i表示的回文串在兩邊新增字元c後變成的回文串編號 兒子 cnt i 節點i表示的本質不同的串的個...

回文自動機

小小總結 別忘了寫上初始化!當字串下標從0 00開始時,pos pospo s初始化為 1 1 1 若從1 11開始,則pos pospo s初始化為0 00 最終的pos pospo s代表最後乙個字元的下標 前者為n 1 n 1n 1,後者為n nn 根據本質不同的回文子串數量不超過 s s s...