试题 算法训练 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;
}