2 条题解

  • 0
    @ 2025-10-8 16:52:17
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1110000;
    char s[N];
    int pre[N];
    int main()
    {
        scanf("%s",s+1);
        int len= strlen(s+1);
        memset(pre,0,sizeof(pre));
        for(int i=1,j=pre[i];i<len;i++,j=pre[i])
        {
            while( j>0 && s[i+1]!=s[j+1] ) j=pre[j];
            if(s[i+1]==s[j+1])pre[i+1]=j+1;
            if(pre[i+1]!=0 && (i+1)%(i+1-pre[i+1])==0 ) printf("%d %d\n",i+1,(i+1)/(i+1-pre[i+1]) );
        }
        return 0;   
    }
    
    • 0
      @ 2025-10-8 16:52:11
      #include<bits/stdc++.h>
      using namespace std;
      const int N=1110000;
      char s[N];
      int  pre[N];
      int main()
      {
          scanf("%s",s+1);
          int len= strlen(s+1);
          memset(pre,0,sizeof(pre));
          for(int i=1,j=pre[i];i<len;i++,j=pre[i])
          {
              while( j>0 && s[i+1]!=s[j+1] ) j=pre[j];
              if(s[i+1]==s[j+1])pre[i+1]=j+1;
              if(pre[i+1]!=0 && (i+1)%(i+1-pre[i+1])==0 ) printf("%d %d\n",i+1,(i+1)/(i+1-pre[i+1]) );
          }
          return 0;   
      }
      • 1

      *【KMP】判断循环段位置[POJ1961]

      信息

      ID
      574
      时间
      1000ms
      内存
      128MiB
      难度
      4
      标签
      递交数
      75
      已通过
      36
      上传者