题目来源:CH1807Necklace
题目描述:有两个由 0~9 构成的字符串(构成环),问这两个字符串是否相同,如果不相同,输出No
;否则输出Yes
,并输出这个字符串的最小表示。
解题思路:先求出两个字符串的最小表示,再扫描一遍判断是否相同。
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 2000000 + 10;
char s1[maxn], s2[maxn];
string b1, b2;
string solve(char s[]){
int n = strlen(s+1);
for(int i = 1; i <= n; i++) s[i + n] = s[i];
int i = 1, j = 2, k;
while(i <= n && j <= n){
for(k = 0; k < n && s[i + k] == s[j + k]; k++);
if(k == n) break; //字符都是一样的,比如“aaaa”
if(s[i + k] > s[j + k]){
i = i + k + 1;
if(i == j) i++;
}
if(s[i + k] < s[j + k]){
j = j + k + 1;
if(i == j) j++;
}
}
int p = min(i, j);
string b = "";
for(int i = p; i - p < n; i++)
b += s[i];
return b;
}
int main()
{
scanf("%s", s1+1);
scanf("%s", s2+1);
b1 = solve(s1);
b2 = solve(s2);
int flag = 0;
for(int i = 0;i < b1.length(); i++)
if(b1[i] != b2[i])
flag = 1;
if(flag == 0){
cout<<"Yes"<<endl;
cout<<b1<<endl;
}
else cout<<"No"<<endl;
return 0;
}