2 条题解

  • 0
    @ 2025-10-8 16:56:15
    #include <bits/stdc++.h>
    using namespace std;
    const int N = 1110000;
    char s1[N], s2[N]; int n;
    
    int get_min(char *s) {
        int i = 0, j = 1;
        while (i < n && j < n) {
            int k = 0; while (k < n && s[i + k] == s[j + k]) k++;
            if (k == n) break;
            if (s[i + k] > s[j + k]) i = i + k + 1; else j = j + k + 1;
            if (i == j) j++;
        }
        int p = min(i, j);
        s[p + n] = '\0';
        return p;
    }
    
    int main() {
        scanf("%s%s", s1, s2);
        n = strlen(s1);
        memcpy(s1 + n, s1, n);
        memcpy(s2 + n, s2, n);
        int i1 = get_min(s1), i2 = get_min(s2);
        if (strcmp(s1 + i1, s2 + i2)) puts("No");
        else puts("Yes"), puts(s1 + i1);
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:56:02
      #include<bits/stdc++.h>
      using namespace std;
      const int N=1110000;
      char s1[N],s2[N];int n;
      int get_min(char *s)
      {
      	int i=0,j=1;
      	while(i<n && j<n)
      	{
      		int k=0;while(k<n && s[i+k]==s[j+k]) k++;
      		if(k==n) break;
      		if(s[i+k]>s[j+k])i=i+k+1;else j=j+k+1;
      		if(i==j)j++;
      	}
      	int p=min(i,j);
      	s[p+n]='\0';
      	return p;
      }
      int main() 
      {
          scanf("%s%s",s1,s2);
          n=strlen(s1);
          memcpy(s1+n,s1,n);
          memcpy(s2+n,s2,n);
          int i1=get_min(s1),i2=get_min(s2);
          if( strcmp(s1+i1,s2+i2) ) puts("No");
          else puts("Yes"),puts(s1+i1);
          return 0;
      }
      • 1

      *【字符串:最小表示法】项链

      信息

      ID
      1301
      时间
      1000ms
      内存
      128MiB
      难度
      6
      标签
      递交数
      170
      已通过
      56
      上传者