项链BZOJ1398
题干在这:BZOJ1398
最小表示法对比一下就好
(我把Yes打成YES,一直WA,过了好久才发现,傻哭)
ac代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<queue>
#include<cstring>
#include<vector>
#define ll long long
#define N 2000010
using namespace std;
char p[N], q[N];
int find_min(char a[]) {
int n = strlen(a);
for (int i = 0; i < n; i++)
a[i + n] = a[i];
int p = 0, q = 1;
while (p < n && q < n) {
int k = 0;
while (k < n && a[p + k] == a[q + k])
k++;
if (k == n)
return p;
if (a[p + k] > a[q + k]) {
p = p + k + 1;
if (p == q)
p++;
}
else {
q = q + k + 1;
if (q == p)
q++;
}
}
return min(p, q);
}
int main() {
gets_s(p);
gets_s(q);
int n = strlen(p);
int place1 = find_min(p);
int place2 = find_min(q);
for (int i = 0; i < n; i++) {
if (p[place1 + i] != q[place2 + i]) {
cout << "No";
return 0;
}
}
cout << "Yes" << endl;
p[place1 + n] = '\0';
puts(p + place1);
}