2 条题解

  • 0
    @ 2025-10-8 16:56:00
    #include <bits/stdc++.h>
    using namespace std;
    typedef unsigned long long ULL;
    const int N = 3e5 + 5;
    const ULL bash = 131;
    char str[N]; int n, s[N];
    ULL d[N], f[N];
    ULL get(int l, int r) { if (r > n) r = n; return f[r] - f[l - 1] * d[r - l + 1]; }
    int solve(int x, int y)//求s[x,x+1……] 和 s[y,y+1……]的最长公共前缀长度
    {
        int l = 0, r = n, res;
        while (l <= r)
        {
            int mid = (l + r) >> 1;
            if (get(x, x + mid - 1) == get(y, y + mid - 1)) l = mid + 1, res = mid;
            else r = mid - 1;
        }
        return res;
    }
    bool cmp(int x, int y)
    {
        int len = solve(x, y);
        return str[x + len] < str[y + len];
    }
    int main()
    {
        scanf("%s", str + 1);
        n = strlen(str + 1);
        d[0] = 1; f[0] = 0;
        for (int i = 1; i <= n; i++)
        {
            d[i] = d[i - 1] * bash;
            f[i] = f[i - 1] * bash + str[i];
            s[i] = i;
        }
        sort(s + 1, s + n + 1, cmp);
        for (int i = 1; i <= n; i++) printf("%d ", s[i] - 1);
        puts("");
        for (int i = 1; i <= n; i++)
            if (i == 1) printf("0 ");
            else printf("%d ", solve(s[i - 1], s[i]));
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:55:53
      #include<bits/stdc++.h>
      using namespace std;
      typedef unsigned long long ULL;
      const int N=3e5+5;
      const ULL bash=131;
      char str[N];int n,s[N];
      ULL d[N],f[N];
      ULL get(int l,int r){if(r>n)r=n;return f[r]-f[l-1]*d[r-l+1];}
      int solve(int x,int y)//求s[x,x+1……] 和 s[y,y+1……]的最长公共前缀长度
      {
          int l=0,r=n,res;
          while(l<=r)
      	{
              int mid=(l+r)>>1;
              if(get(x,x+mid-1)==get(y,y+mid-1))l=mid+1,res=mid;
              else r=mid-1;
          }
          return res;
      }
      bool cmp(int x,int y)
      {
          int len=solve(x,y);
          return str[x+len]<str[y+len];
      }
      int main()
      {
          scanf("%s",str+1);
          n=strlen(str+1);
          d[0]=1;f[0]=0;
          for(int i=1;i<=n;i++)
      	{
              d[i]=d[i-1]*bash;
              f[i]=f[i-1]*bash+str[i];
              s[i]=i;
          }
          sort(s+1,s+n+1,cmp);
          for(int i=1;i<=n;i++)printf("%d ",s[i]-1);
          puts("");
          for(int i=1;i<=n;i++)
              if(i==1)printf("0 ");
              else printf("%d ",solve(s[i-1],s[i]));
          return 0;
      }
      • 1

      信息

      ID
      1279
      时间
      4000ms
      内存
      128MiB
      难度
      3
      标签
      递交数
      72
      已通过
      41
      上传者