試題 算法訓練 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;
}