知识点:最小表示法
难度:5
这个算是最小表示法的模板题,4分钟就过了
感觉难度有点虚高,学会之后还是挺简单的,最小表示法,用来解决求字符串最小表示的问题,这种问题一般都需要断环为链,再在原来的字符串后面补上一个同样的字符串,然后再去遍历,用线性的时间复杂度去解决这个问题,我的代码比李煜东写的还简练一点,
#include <bits/stdc++.h>
using namespace std;
int main() {
int T;
cin >> T;
while (T--) {
string s;
cin >> s;
s = " " + s;
int len = (int) s.size();
for (int i = 1; i <= len; i++) {
s += s[i];
}
int l = 1, r = 2;
while (l <= len && r <= len) {
int k;
for (k = 0; k < len && s[l + k] == s[r + k]; k++);
if (k == len) break;
if (s[l + k] > s[r + k]) l += k + 1;
else r += k + 1;
if (l == r) l++;
}
cout << min(l, r) << endl;
}
return 0;
}