考慮分別計算每個位置作為aa的末尾或者bb的開頭的個數 最後乘一乘就是答案
據說是套路的計算aa的方法:
首先列舉a的長度l,然後每l個字元當做乙個關鍵點,這樣的話,乙個aa包含且只包含相鄰兩個關鍵點(記為a,b),而且滿足lcp(a,b)+lcs(a,b)-1>=l 手畫一下就能看出來
於是sa搞lcp 倒過來再sa搞lcs 最後差分一下統計答案即可
1 #include2#define pa pair3
#define clr(a,x) memset(a,x,sizeof(a))
4#define mp make_pair
5using
namespace
std;
6 typedef long
long
ll;7
const
int maxn=3e4+10;8
9 inline char
gc()
14inline ll rd()
17while(c>='
0'&&c<='
9') x=(x<<1)+(x<<3)+c-'
0',c=gc();
18return neg?(~x+1
):x;19}
2021
char
str[maxn];
22int
lg2[maxn],n;
2324
struct
sam=j;49}
5051 hei[1]=0;52
for(i=1,j=0;i<=n;i++)
59//
for(i=1;i<=n;i++) printf("hei:%d %d ; rnk:%d ; sa:%d \n",i,hei[i],rnk[i],sa[i]);
60for(i=n;i;i--)65}
66}6768 inline int query(int x,int y)
75}fw,bw;
7677
intend[maxn],beg[maxn];
7879
intmain()
101}
102}
103for(i=1;i<=n;i++) end[i]+=end[i-1],beg[i]+=beg[i-1
];104 ll ans=0
;105
for(i=1;i)
108 printf("
%lld\n
",ans);
109}
110return0;
111 }
字串hash 洛谷P1117 優秀的拆分
這裡講一95分的演算法 就是用字串hash取搞 怎麼弄呢?我們列舉aa 所有的aa 用字串hash取判斷a和a是否相同 然後記錄aa的開頭位置和結尾位置 然後乘法原理統計答案就好了 include define pow define ll long long using namespace std ...
優秀的拆分(power)
1 include2 using namespace std 3int main 417 18return0 19 舉例說明1 14 的可以最優拆分為 8 4 2 14的二進位制1110 8 的二進位制1000 與14按位 結果為1000 8 非0 4 的二進位制0100 與14按位 結果為0100...
bzoj 4650 優秀的拆分
先給大家安利乙個80分 小學生都會寫的 版本 分析 複雜度o n 3 在洛谷上測一下可以過80分 特判懶得寫,加上就90了 g i j 表示i到j之間能否構成 aa 的形式,暴力就可以出來 然後枚舉子序列長度,起點位置,以及斷點位置與起點的長度,就能找出 aabb 中a與b接壤的位置,然後左邊右邊都...