pta 7-20 xrf的镜子碎了?

pta 7-20 xrf的镜子碎了?

xrf有一面镜子,可以把任何接触镜面的东西变成原来的两倍,同时呢,那增加的那部分是反的。
xrf很喜欢他的镜子,但是因为一股神秘力量(可能来自pltdhll),xrf的镜子碎了!xrf很伤心。

lyx知道后想要把自己的镜子送给xrf,(lyx的镜子有一个独属于lyx的名字,叫做“lyx的镜子”)。而lyx的镜子虽然可以把接触镜面的东西变成原来的两倍,但增加的那部分是相同的。

lyx为了展示他的镜子,不知道从哪拿来了一串珍珠项链。我们把项链用AB来表示,不同的字母表示不同颜色的珍珠。如果把A端接触镜面的话,镜子会把这条项链变成ABAB;如果再用B端接触的话,则会变成ABABABAB,即不论用哪端接触增加的部分都是相同的。

xrf收到镜子后迫不及待的想要试一下,于是想拿出随身带的珍珠项链,可是不知道珍珠项链哪去了,只好重新找了一条珍珠项链测试了。

xrf始终只用项链的一端接触镜子,经过多次与镜子接触最终得到了一条新的项链,xrf觉得这面镜子很有意思,但是忘了最初的项链长什么样了,只记得最初始的项链是不可能与lyx的镜子接触过。现在xrf把这个新的项链给你,请你帮他找出原来项链的形状。

注:

xrf给你的项链可能没有接触过lyx的镜子(可能是因为xrf很幽默\斜眼笑)。

若项链为ABAB,则我们认为该项链可能与lyx的镜子接触过。

若项链为AB,则我们认为该项链不可能与lyx的镜子接触过。

  • 题目大意:给定一串由最初的子串不断加倍形成的字符串,要求最初的字串。

输入格式:

一个由大写英文字母(A~Z)组成的字符串(长度不超过100000),表示xrf给你的项链。

输出格式:

一个字符串,表示项链的形状。

输入样例1:

ABABABAB

输出样例1:

AB

输入样例2:

ABCDEFGHIJKLMN

输出样例2:

ABCDEFGHIJKLMN

大体思路:

如果是字符个数是奇数的字符串直接输出,如果是偶数的字符串从第一个开始每次用1~n/2个字符相比较,比如AACAAACA这个字符串,先拿A和之后的所有单个字符相比,然后拿AA和之后的所有两个字符相比(AA比CA),一直比到AACA比AACA找到答案,输出。

AC代码:

#include
using namespace std;
int main()
{
	string s;
	cin >> s;
	int subsize = 0;
	bool same = true;
	if (s.size() % 2 != 0)
		cout << s;
	else
	{
		while (++subsize <= s.size() / 2)
		{
			same = true;
			for (int i = subsize; i < s.size(); i+=subsize)
			{
				//substr函数的作用为截取字符串中从所给地址到所给个数的字符。
				if (s.substr(0, subsize) != s.substr(i, subsize))
				{
					same = false;
					break;
				}
			}
			if (same)
			{
				cout << s.substr(0, subsize)<<"\n";
				break;
			}
		}
		if (!same)
			cout << s << "\n";
	}
	return 0;
}

你可能感兴趣的:(pta记录,c++,算法,数据结构)