华师一附中OI组
标题:
P2799 国王的魔镜
[打印本页]
作者:
admin
时间:
2018-5-5 19:04
标题:
P2799 国王的魔镜
https://www.luogu.org/problemnew/show/P2799
题目描述
国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的。比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话,魔镜会把这条项链变为ABBA。如果再用一端接触的话,则会变成ABBAABBA(假定国王只用项链的某一端接触魔镜)。给定最终的项链,请编写程序输出国王没使用魔镜之前,最初的项链可能的最小长度。
输入输出格式
输入格式:
只有一个字符串,由大写英文字母组成(字母数<=100000),表示最终的项链。
输出格式:
只有一个整数,表示国王没使用魔镜前,最初的项链可能的最小长度。
输入输出样例
输入样例#1:
ABBAABBA
输出样例#1:
2
作者:
admin
时间:
2018-5-5 19:52
一个串要是长度为偶数并且回文那么他可以由字串得到,这个子串递归判断,直到不是回文或者长度为奇数。
bool check(string s) 判断是否长度为奇数,或者不是回文
string get(string s)
{
if (!check(s)) return s;
else return (s的一半)
}
下面就不需要我再写下去了吧
作者:
张笑宇
时间:
2018-5-5 19:54
#include<iostream>
using namespace std;
string s;
int l,i;
bool b=true;
int main()
{
cin>>s;
l=s.size();
while (b)
{
if (l%2==1) b=false;///如果长度为奇数,就舍去
else
{
for (i=1;i<=l/2;i++)
{///从头至尾搜索
if (s[i-1]!=s[l-i]) b=false;
}///发现错的就舍去
if (b) l=l/2;///如果可以再对折
}
}
cout<<l;
return 0;
}
复制代码
作者:
黄煦喆
时间:
2018-5-5 20:04
#include<iostream>
#include<algorithm>
using namespace std;
string s;
int r,ans;
void ms(int r)
{
while(r%2==0)
{
//cout<<r<<endl;
for(int i=0; i<r/2; i++)
if(s[i]!=s[r-i-1])
{
ans=r;
return;
}
r/=2;
ans=r;
}
}
int main()
{
cin>>s;
ans=r=s.size();
ms(r);
cout<<ans;
return 0;
}
复制代码
作者:
黄诗绮
时间:
2018-5-5 20:09
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char a[100002];
int l,i;
cin>>a;
l=strlen(a);
while(1)
{
if(l%2==1){
cout<<l<<endl;
return 0;
}
for(i=0;i<l;i++)
{
if(a[i]!=a[l-i-1]){
cout<<l<<endl;
return 0;
}
}
l/=2;
}
}
复制代码
作者:
王令欧
时间:
2018-5-5 20:32
#include <stdio.h>//王令欧
#include <string.h>
int main()
{
int len,i,j,ls;
char a[100001];
scanf("%s",a);
len=strlen(a);
while(1)
{
for(i=0;i<=len/2-1;i++)
{
if(len-i-2==i)
{
len=len/2;
for(j=i+1;j<=len+i;j++)
{
a[j]='0';
}
}
}
for(i=0;i<=len/2-1;i++)
if(a[i]!=a[len-i-1])
break;
if(a[i]!=a[len-i-1])
break;
}
for(i=0;i<=len-1;i++)
printf("%c",a[i]);
return 0;
}
复制代码
作者:
王令欧
时间:
2018-5-5 20:38
#include <stdio.h>//王令欧
#include <string.h>
int main()
{
int len,i,j,ls;
char a[100001];
scanf("%s",a);//输入
len=strlen(a);
while(1)
{
for(i=0;i<=len/2-1;i++)
{
if(len-i-2==i)
{
len=len/2;
for(j=i+1;j<=len+i;j++)
{
a[j]='0';
}//留下一半
}
}
for(i=0;i<=len/2-1;i++)
if(a[i]!=a[len-i-1])
break;
if(a[i]!=a[len-i-1])//如果不回文了,就跳出循环
break;
}
printf("%d",len);
return 0;
}
复制代码
作者:
admin
时间:
2019-3-15 15:44
#include <iostream>
using namespace std;
int work(string s)
{
int l=s.size();
if (l%2==1) return l; ///单数长度则不能分解
int x=l/2;
string s1=s.substr(0,x); ///第一段
string s2=s.substr(x,x); ///第二段
string s3="";
///cout<<s1<<' '<<s2<<' '<<s3<<endl;
for (int i=0;i<=x-1;i++) s3=s2[i]+s3;
if (s1==s3) return work (s1);else return l;
}
int main()
{
string s;
cin>>s;
cout<<work(s);
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2