题目链接:https://www.starrycoding.com/problem/161
题目描述
小 e e e有一个宝箱,这个宝箱有一个长度为 n n n的密码,但是这个密码校验器是一个环形,意思是只要密码从任意一位开始读(读到最后一位回到第一位继续),与真实密码一致,则认为是正确的,宝箱就会打开。
例如,真实密码为 S t a r r y C o d i n g StarryCoding StarryCoding,那么 r y C o d i n g S t a r ryCodingStar ryCodingStar正确, d i n g S t a r r y C o dingStarryCo dingStarryCo正确,但 S t a C o d i n g r r y StaCodingrry StaCodingrry不正确。
现在给出真实密码 S 1 S_1 S1和小 e e e输入的密码 S 2 S_2 S2,请你判断宝箱能否打开。
输入格式
第一行一个整数 T ( 1 ≤ T ≤ 100 ) T(1 \le T \le 100) T(1≤T≤100)表示样例个数。
对于每一个样例:
第一行一个整数 n ( 1 ≤ n ≤ 1 0 3 ) n(1 \le n \le 10^3) n(1≤n≤103)表示真实密码和输入密码的长度。
第二行两个字符串 S 1 , S 2 S_1, S_2 S1,S2,字符串仅包含大小写字母。
输出格式
对于每组样例,如果可以打开宝箱,输出 Y E S YES YES,反之输出 N O NO NO。
输入样例1
3
3
ABC BCA
6
starry starru
6
coding dingco
输出样例1
YES
NO
YES
题解
遇到环形的问题,我们一般会通过将原字符串复制一份的方式来模拟环形。
于是本题只需要将S2复制一份,然后检测每一段子串看下是否存在与S1相同的即可。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
void solve()
{
int n;
cin >> n;
string s1, s2;
cin >> s1 >> s2;
s2 += s2;
for (int i = 0; i < n; ++i)
{
if (s2.substr(i, n) == s1)
{
cout << "YES" << '\n';
return;
}
}
cout << "NO" << '\n';
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int _;
cin >> _;
while (_--)
solve();
return 0;
}
通过记录:https://www.starrycoding.com/submission/5194