1 条题解

  • 0
    @ 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
    标签
    递交数
    21
    已通过
    2
    上传者