51Nod_1347 旋转字符串
http://www.51nod.com/Challenge/Problem.html#!#problemId=1347
题意
S[0...n-1]是一个长度为n的字符串,定义旋转函数Left(S)=S[1…n-1]+S[0].比如S=”abcd”,Left(S)=”bcda”.一个串是对串当且仅当这个串长度为偶数,前半段和后半段一样。比如”abcabc”是对串,”aabbcc”则不是。现在问题是给定一个字符串,判断他是否可以由一个对串旋转任意次得到。
输入
第1行:给出一个字符串(字符串非空串,只包含小写字母,长度不超过1000000)
输出
对于每个测试用例,输出结果占一行,如果能,输出YES,否则输出NO。
样例输入
aa
ab
样例输出
YES
NO
分析
思维题,细心一点可以发现,如果一个字符串是对串,那么无论它怎么循环左移,形成的字符串仍然是对串,因此只要判断给出的字符串是否是对串就可以了。
C++程序
#include<iostream>
#include<string>
using namespace std;
bool solve(string s)
{
int l=s.length();
if(l%2) return false;
string str=s.substr(0,l/2);
str+=str;
if(str==s)
return true;
else
return false;
}
int main()
{
string s;
while(cin>>s)
{
bool flag=solve(s);
printf("%s\n",flag?"YES":"NO");
}
return 0;
}