1 条题解
-
0
思路
每个前缀取最短非空Border得到最大proper周期,QQ须覆盖原前缀,不是最短完整重复节,答案用64位。
参考程序(C++11)
#include <bits/stdc++.h> using namespace std; int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int n;string s;cin>>n>>s;vector<int>p(n),shortest(n+1);for(int i=1;i<n;i++){int j=p[i-1];while(j&&s[i]!=s[j])j=p[j-1];if(s[i]==s[j])j++;p[i]=j;}long long ans=0;for(int i=1;i<=n;i++)if(p[i-1]){int b=p[i-1];shortest[i]=shortest[b]?shortest[b]:b;if(shortest[i]*2<=i)ans+=i-shortest[i];}cout<<ans<<'\n';}
- 1