題意:給定乙個數字串,求每個不同回文數字串的和
也可以通過每個回文的區間+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...