2 条题解

  • 0
    @ 2025-10-8 17:08:52
    #include <bits/stdc++.h>
    using namespace std;
    const int N=1.6e4;
    char s[N];
    int pre[N],ans,n,k;
    void get_pre(int x)
    {
        memset(pre,0,sizeof(pre));
        for(int i=1,j=pre[i]; i<n-x; i++,j=pre[i]) 
        {
            while( j>0 && s[i+1+x]!=s[j+1+x]) j=pre[j];
            if(s[i+1+x]==s[j+1+x])pre[i+1]=++j;
            
            while(j>=k) 
            {
                if(j*2<i+1){ans++;break;} 
                j=pre[j];
            }
        }
    }
    int main() 
    {
        scanf("%s%d",s+1,&k);
        n=strlen(s+1);
        ans=0;
        for(int i=0;i<n; i++)get_pre(i);
        printf("%d\n",ans);
        return 0;
    }
    
    • 0
      @ 2025-10-8 17:08:44
      #include<bits/stdc++.h>
      using namespace std;
      const int N=1.6e4;
      char s[N];
      int pre[N],ans,n,k;
      void get_pre(int x)
      {
      	memset(pre,0,sizeof(pre));
      	for(int i=1,j=pre[i]; i<n-x; i++,j=pre[i]) 
          {
              while( j>0 && s[i+1+x]!=s[j+1+x]) j=pre[j];
              if(s[i+1+x]==s[j+1+x])pre[i+1]=++j;
              
              while(j>=k) 
      		{
      			if(j*2<i+1){ans++;break;} 
      			j=pre[j];
      		}
          }
      }
      int main() 
      {
          scanf("%s%d",s+1,&k);
          n=strlen(s+1);
          ans=0;
          for(int i=0;i<n; i++)get_pre(i);
          printf("%d\n",ans);
          return 0;
      }
      • 1

      信息

      ID
      5285
      时间
      1000ms
      内存
      256MiB
      难度
      7
      标签
      递交数
      48
      已通过
      10
      上传者