代码源每日一题
一个字符串SS是另一字符串TT的循环子串当且仅当存在kk, TT所有字符循环右移kk位后得到的新串T′T′,满足SS是T′T′的子串。
例如: abc
是 cefab
的循环子串。 (cefab
循环右移22位得到abcef
, abc
是abcef
的子串)
一个串PP是完全循环串当且仅当对于它的任一子串HH, 都有HreverseHreverse是PP的循环子串 (HreverseHreverse 为 HH的倒转, 如abc
reverse后 为cba
)。
给一个长度为nn的字符串, 判断它是不是完全循环串。
输入格式
第一行一个正整数tt, 表示测试数据组数。
对于每一组数据,第一行一个正整数nn, 表示字符串的长度。接下来一行一个长度为nn的字符串. 仅包含小写字母。
输出格式
对于每组测试数据,如果这个串是完全循环串, 输出YES
,否则输出NO
。每组测试数据之间输出换行。
数据范围
对于所有数据 有 1≤t≤1001≤t≤100, 1≤n≤1031≤n≤103, ∑n≤103∑n≤103。
样例输入
2
4
ccca
11
eeaafbddfaa
样例输出
YES
NO
提示 选中可以查看
1. 本道题目只需要语法知识就可以解决。
2. 任意子串是什么意思呢?
3. 如果一
思路:遇到字符串循环时,也就是需要首尾相连时:直接将输入的字符串变成俩首尾相连即可。用 len=2,开始循环比较字符串
string用法:substr:是将从 i 开始,然后向后数 len 个数,提取出来。如:string res=substr(i,len)
find:find找不到的话会返回npos。如:s.find(res)==s.npos,即没找到
完整代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
const int N=1e3+10;
int a[N];
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
string s;
cin>>s;
s+=s;
bool ok=true;
for(int len=2;len<=n;len++)
{
for(int i=0;i+len<=n;i++)
{
string res=s.substr(i,len);
reverse(res.begin(),res.end());
if(s.find(res)==s.npos)
{
ok=false;
}
}
if(!ok)break;
}
if(ok)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}