1 条题解
-
0赵青海 (huhe) LV 7 SU @ 2023-11-18 21:00:56
#include<bits/stdc++.h> using namespace std; const int N=15005; int nex[N],ans,s,dp[N]; void KMP(char st[]){ int n=strlen(st+1); int k=0; nex[1]=0; memset(dp,0,sizeof(dp)); for(int i=2;i<=n;i++){//枚举右端点i,求next数组 while(k&&st[k+1]!=st[i])k=nex[k]; if(st[k+1]==st[i])k++; nex[i]=k; if(dp[k]){dp[i]=dp[k];}//如果还有更小的,就找最小的next else{ if(k>=s){dp[i]=k;}//如果达到了限制条件 else{dp[i]=0;} } if(dp[i]&&2*dp[i]+1<=i)ans++;//统计答案 } } char st[N]; int main(){ scanf("%s",st+1); scanf("%d",&s); int n=strlen(st+1); for(int i=0;i<=n;i++)KMP(st+i);//枚举左端点,进行KMP printf("%d",ans); }
- 1
信息
- ID
- 389
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 9
- 标签
- 递交数
- 22
- 已通过
- 2
- 上传者