1 条题解

  • 0
    @ 2026-10-25 21:18:15

    思路

    每个起点维护不超过半长的最长Border,A两段之间B非空,同一子串不同拆法只计一次,1.5万长度可二次扫描。

    参考程序(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    int main(){ios::sync_with_stdio(false);cin.tie(nullptr);string s;int k;cin>>s>>k;int n=s.size();vector<int>p(n);long long ans=0;for(int start=0;start+2*k<n;start++){const char*t=s.data()+start;int m=n-start,j=0;p[0]=0;for(int i=1;i<m;i++){int v=p[i-1];while(v&&t[v]!=t[i])v=p[v-1];if(t[v]==t[i])v++;p[i]=v;while(j&&t[j]!=t[i])j=p[j-1];if(t[j]==t[i])j++;while(2*j>=i+1)j=p[j-1];if(j>=k)ans++;}}cout<<ans<<'\n';}
    
    • 1

    信息

    ID
    1522
    时间
    1000ms
    内存
    64MiB
    难度
    普及+
    标签
    递交数
    1
    已通过
    1
    上传者