蓝桥杯试题 算法训练 Have You Ever Heard About the Word?

试题 算法训练 Have You Ever Heard About the Word?

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
  一个字符串的子串是该字符串的一段连续子序列,如bca是abcabc的子串,而cc不是。

一个重复块(repeating block)由一个字符串与自身连接而成,如abcabc是一个重复块,而abcabd, ababab不是。

你有一个由拉丁字符组成的字符串。每一步你要找到它的子串中最短的重复块,如果有多于一个,你必须选择最左边的那个。你要将那个形如XX(X - 某个字符串)的重复块替换成X,换句话说你要删除其中的一个X。重复以上步骤直到字符串中不存在重复块。

最终的字符串会是怎样的?看样例解释来更清楚地理解问题描述。
输入格式
  一行,一个由小写拉丁字符组成的字符串。
输出格式
  输出做完所有操作后的字符串。
样例输入
aaaabaaab
样例输出
ab
数据规模和约定
  1<=输入字符串长度<=50000
样例说明
  字符串变换过程如下:aaaabaaab  →  aaabaaab  →  aabaaab  →  abaaab  →  abaab  →  abab  →  ab
提交代码
在这里插入图片描述

#include <iostream>
#include <cstdio>
#include <string>

using namespace std;

int main()
{
	string s;
	cin >> s;
	int n = s.length();
	int i, j;
	for(int len = 1; len <= n / 2; len ++)
	{
		int match = 0;
		for(i = 0; i + len < n; i ++)
		{
			if(s[i] == s[i + len]) match ++;
			else match = 0;
			if(match == len) break;
		}
		if(match == len)
		{
			for(j = i + 1; j + len < n; j ++) s[j] = s[j + len];
			n -= len;
			len = 0;
		}
	}
	string ans = s.substr(0, n);
	cout << ans;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章