7960 照镜子
经验值:2000
时间限制:1000毫秒
内存限制:128MB
题目描述 Description
我们现在有一张写着大写字母串的纸条,比如纸条上写着BA,有这样一面镜子,我们将大写字母串的一端(比如纸条上的A那一端)靠近镜子,纸条就会变成长,变成原来的两倍,不过由于镜像的原因,纸条会变成写着BAAB的纸条,现在我们把这个纸条再靠近镜子,就会变成BAABBAAB,假定只用纸条的某一端靠近镜子。先给定最终的纸条,请写出没用镜子加长之前,最初的纸条上的字符串可能的最小长度。
输入描述 Input Description
一串大写字母字符串,表示最终的纸条。
输出描述 Output Description
最初的纸条可能的最小长度。
样例输入 Sample Input
ABBAABBA
样例输出 Sample Output
2
数据范围及提示 Data Size & Hint
输入的大写字符串长度<=1000000
各位童鞋,在拿到这道题时,我是十分惊讶
因为:
我十分懵逼
可后来,我悟了
废话不多说,用二分直接做
#include<iostream>
using namespace std;
string s;
bool hw(int n){
int l=0,r=n-1;
while(l<r){
if(s[l]!=s[r]){
return true;
}
l++;
r--;
}
return false;
}
int f(int n){
if(n%2==1||hw(n)) return n;
return f(n/2);
}
int main(){
getline(cin,s);
int t=s.size();
cout<<f(t);
return 0;
}