51nod 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

如果满足条件一定是偶数个字符,不管怎么旋转,都是前半段等于后半段的。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX 1000000
using namespace std;
char s[MAX + 1];
char t[MAX + 1];
bool check() {
    int len = strlen(s);
    if(len % 2) return false;
    strcpy(t,s + len / 2);
    s[len / 2] = 0;
    if(strcmp(s,t)) return false;
    return true;
}
int main() {
    while(~scanf("%s",s)) {
        puts(check() ? "YES" : "NO");
    }
}
原文地址:https://www.cnblogs.com/8023spz/p/10079024.html