S[0…n-1]是一个长度为n的字符串,定义旋转函数Left(S)=S[1…n-1]+S[0].比如S=”abcd”,Left(S)=”bcda”.一个串是对串当且仅当这个串长度为偶数,前半段和后半段一样。比如”abcabc”是对串,”aabbcc”则不是。
现在问题是给定一个字符串,判断他是否可以由一个对串旋转任意次得到。
Input
第1行:给出一个字符串(字符串非空串,只包含小写字母,长度不超过1000000)
Output对于每个测试用例,输出结果占一行,如果能,输出YES,否则输出NO。
Inputaa
ab
OutputYES
NO
题意有点晕,大意是把一个字符串首尾相接后,如果可以找到一个位置,能令这个位置前后的字符串相同,那么他就是一个对串。例如“fghasdfghasd”从第四个a开始的“asdfgh”与其后的“asd”+“fgh”相同,则这是一个对串。
这样的话,简单的暴力求解。从串的中间位置开始查找,直到末尾。
通过代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include<cstdio> #include<cstring> #include<iostream> using namespace std; char a[1000005]; int main() { while(cin >> a) { int len = strlen(a); if(len % 2 != 0) ///如果字符个数是奇数个则不满足要求,返回NO; { cout << "NO" << endl; continue; } bool flag = false; ///立一个flag; for(int i = 0;i < len;i ++) { if(a[(i + len/2) % len] != a[i]) ///从串的中间开始比较,一旦不满足条件就输出NO并break; { cout << "NO" << endl; flag = true; ///不满足条件,flag中了; break; } } if(flag){ continue; } ///如果flag为真则跳过后面的,否则执行输出YES; cout << "YES" << endl; } } |