题解 CF23A 【You're Given a String...】

Update:2021.1.14,发现了几个错误

暴力就完了!

这里我们很明显可以用接近 O(n4)\large O(n^4) 的暴力枚举,那么对于匹配两次出现我们可以用 find

每次 erase

不对,erase 的坏处是会直接破坏原来字符串,并且也不是 O(1)\large O(1) 的删除,我们可以用 find 的另一个重载函数去做:

find(string, int);

第一个还是存要找的字符串,第二个是一个下标,代表搜索范围从这个下标到最后一个字符。

代码,996ms:

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

inline bool check(string&);

string s;

int main()
{
	cin >> s;
	int len = s.size() - 1, ans = 0;
	for (register int i = len; i >= 0; i--)
	{
		for (register int j = 0; j <= i; j++)
		{
			string x = s.substr(j, i - j + 1);
			if (check(x))
			{
				ans = max(ans, i - j + 1);
			}
		}
	}
	cout << ans << endl;
	system("pause");
	return 0;
}

inline bool check(string& x)
{
	string v = s;
	int cnt = 0, last = -1;
	while (v.find(x, last + 1) != string::npos && cnt < 2)
	{
		cnt++;
		last = v.find(x, last + 1);
	}
	return cnt >= 2;
}
posted @   HappyBobb  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示