藍橋杯試題 算法訓練 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章