1 条题解

  • 0
    @ 2026-4-26 17:50:28
    前方高能!!!
    #include<iostream>
    using namespace std;
    int main(){
    	for(long long i=0;i<=514514;i++){
    		cout<<"1111111111111111111111111111111111111111111111111";
    	}
    	return 0;
    }
    
    真的能过,信我。
    • @ 2026-4-26 17:57:27

      我试过貌似不能,但AC通过区里确实有大神@4092 如果不行的话,用这个:

      #include<cstdio>
      #include<cmath>
      #include<algorithm>
      #include<cstring>
      #define seed 13131
      #define maxn 500005
      using namespace std;
      typedef unsigned long long ull;
      char s[500005];
      ull s1[500005];
      ull ss[500005];
      int sushu[500005];
      int used[500005];
      int nxt[500005];
      int k;
      int ys[500005];
      void pri()
      {
          for(int i = 2;i<= maxn;i++)
          {
              if(used[i] == 0)
              {
                  sushu[++k] = i;
                  nxt[i] = i;
              }
              for(int j = 1;j <= k && (long long)i*sushu[j]<= maxn;j++)
              {
                  used[i*sushu[j]] = 1;
                  nxt[i*sushu[j]] = sushu[j];
                  if(i%sushu[j] == 0)
                  {
                      break;
                  }
              }
          }
      }
      int check(int l1,int r1,int l2,int r2)
      {
          if(s1[r1]-ss[r1-l1+1]*s1[l1-1] == s1[r2]-ss[r2-l2+1]*s1[l2-1])
          {
              return 1;
          }
          return 0;
      }
      int main()
      {
          int n;
          scanf("%d", &n);
          scanf("%s",s+1);
          int q;
          scanf("%d", &q);
          for(int i = 1;i <= n;i++)
          {
              s1[i] = s1[i-1]*seed+s[i]-'a'+1;
          }
          ss[0] = 1;
          for(int i = 1;i <= n;i++)
          {
              ss[i] = ss[i-1]*seed; 
          }
          pri();
          for(int i = 1;i <= q;i++)
          {
              int l,r;
              scanf("%d%d", &l, &r);
              int len = r-l+1;
              int tt = 0;
              while(len != 1)
              {
                  ys[++tt] = nxt[len];
                  len = len/nxt[len];
              }
              len = r-l+1;
              for(int j = 1;j <= tt;j++)
              {
                  int t = len/ys[j];
                  if(check(l,r-t,l+t,r) == 1)
                  {
                      len = t;
                  }
              }
              printf("%d\n",len);
          }
          return 0;
      }
      
      
  • 1

信息

ID
381
时间
1200ms
内存
512MiB
难度
10
标签
递交数
5
已通过
2
上传者