您的位置:首页 > 其它

51 nod 1347(旋转字符串)

2018-02-01 14:16 369 查看
1347 旋转字符串 

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。


Input示例
aa
ab


Output示例
YES
NO

PS:陷阱.... :一个对串怎么旋转都是对串,不是对串怎么旋转都不是对串...傻乎乎的按题目意思搞了半天.........感觉自己智商堪忧啊。

附ac代码:

#include <iostream>
#include <string.h>
#define max 1000000+5
using namespace std;
char a[max],b[max],c[max];
int main()
{
while(scanf("%s",a)!=EOF)
{
int n=strlen(a);
int m=n/2,i,ans=0,t=0;
for(i=0; i<m; i++)
b[i]=a[i];
for(i=m; i<n; i++)
c[t++]=a[i];
if(strcmp(b,c)!=0)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}


原代码.........:

#include <iostream>
#include <cstring>
#define max 1000000 + 5
using namespace std;
char a[max],b[max],c[max];
void Left(char a[])
{
char c=a[0];
int i,n=strlen(a);
for(i=0; i<n-1; i++)
{
a[i]=a[i+1];
}
a[n-1]=c;
}
int main()
{
while(scanf("%s",a)!=EOF)
{
int n=strlen(a);
if(n%2==1)
{
cout<<"NO"<<endl;
}
else
{
int m=n/2,i,ans=0,t=0;
for(i=0; i<m; i++)
b[i]=a[i];
for(i=m; i<n; i++)
c[]=a[i];
while(strcmp(b,c)!=0)
{
Left(a);
ans++;
if(ans>=m)
break;
}
if(ans>=m)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: