[CTSC2014] 企鹅 QQ

链接

题意就是找出有多少字符串相似(两个字符串对应每个位置之后只有一处不同)

我们可以枚举每一个字符串单独去掉某个字符后的hash值(最好双哈希)

但要注意去掉的位置,因此我们需要将每个位置单独进行处理

一开始我使用unordered_map来存储hash,但是超时了

查阅资料发现unordered_map在面对大数据(这题达到30000)时,会显得有点鸡肋,因此选择用二维数组存储

一个小细节:计算右半部分的hash,减法可能造成负数结果,需要补上mod

代码如下:

#include<iostream>
#include<vector>
#include<algorithm>
#define ll long long
const ll mod1 = 1e9 + 7;
const ll mod2 = 1e9 + 9;
const int base = 2333;
using namespace std;

void solve() {
	int t, n, k;
	cin >> t >> n >> k;
	vector<ll>h1(n + 1, 0), h2(n + 1, 0), b1(n + 1, 1), b2(n + 1, 1);
	vector<vector<ll>>keys(n, vector<ll>(t));
	for (int i = 1;i <= n;i++) {
		b1[i] = b1[i - 1] * base % mod1;
		b2[i] = b2[i - 1] * base % mod2;
	}
	for (int m = 0;m < t;m++) {
		string str;
		cin >> str;
		
		for (int i = 1;i <= n;i++) {
			h1[i] = h1[i - 1] * base % mod1;
			h2[i] = h2[i - 1] * base % mod2;
			if (k == 64) {
				int val = str[i - 1];
				if ('0' <= val && val <= '9') h1[i] += val - '0', h2[i] += val - '0';
				else if ('a' <= val && val <= 'z') h1[i] += val - 'a' + 10, h2[i] += val - 'a' + 10;
				else if ('A' <= val && val <= 'Z') h1[i] += val - 'A' + 36, h2[i] += val - 'A' + 36;
				else if (val == '_') h1[i] += 62, h2[i] += 62;
				else h1[i] += 63, h2[i] += 63;
			}
			else {
				h1[i] += str[i - 1] - '0';
				h2[i] += str[i - 1] - '0';
			}
			h1[i] %= mod1;
			h2[i] %= mod2;
		}
		for (int i = 1;i <= n;i++) {			
			ll hash1 = (h1[n] - h1[i] * b1[n - i] % mod1 + mod1) % mod1 + (h1[i - 1] * b1[n - i]) % mod1;
			ll hash2 = (h2[n] - h2[i] * b2[n - i] % mod2 + mod2) % mod2 + (h2[i - 1] * b2[n - i]) % mod2;
			hash1 %= mod1, hash2 %= mod2;
			ll hash = hash1 * mod1 + hash2;
			keys[i-1][m] = hash;
		}
	}
	ll ans = 0;
	for (int i = 0;i < n;i++) {
		sort(keys[i].begin(), keys[i].end());
		ll cnt = 1;
		for (int j = 0;j < t - 1;j++) {
			if (keys[i][j] == keys[i][j + 1]) cnt++;
			else {
				ans += (cnt * (cnt - 1) / 2);
				cnt = 1;
			}
		}
		ans += (cnt * (cnt - 1) / 2);
	}
	cout << ans;
	
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	solve();
}

时间复杂度:O(n * t)

空间复杂度:O(n * t)

全部评论
可以的,总结的很好
点赞 回复 分享
发布于 03-29 21:48 北京

相关推荐

ollama&nbsp;v0.18.3&nbsp;发布:VS&nbsp;Code&nbsp;原生集成&nbsp;+&nbsp;Agent&nbsp;模式,本地&nbsp;AI&nbsp;开发体验全面革新3.1&nbsp;Agent模式定义:让Ollama具备自主执行开发任务的能力Ollama&nbsp;v0.18.3正式开放Agent模式,这一功能让Ollama能够借助VS&nbsp;Code的Agent模式能力,自主执行命令、编辑文件、迭代代码,从单纯的“问答式AI助手”升级为“可行动的开发智能体”,大幅提升AI在开发流程中的自动化能力。简单来说,Agent模式下的Ollama不再局限于“你问我答”,而是可以根据开发者的指令,直接操作VS&nbsp;Code完成一系列开发任务,例如运行测试、修复Bug、生成文档、修改代码等,实现开发流程的自动化与智能化。3.2&nbsp;实用指令:Agent模式下的高频开发指令示例Agent模式支持开发者通过自然语言指令,让Ollama自主完成复杂开发任务,以下是本次更新中官方推荐的高频实用指令,覆盖测试、文档、代码生成三大核心场景:1.&nbsp;测试相关指令:•&nbsp;“Run&nbsp;the&nbsp;tests&nbsp;and&nbsp;fix&nbsp;any&nbsp;failures”(运行测试并修复所有失败用例):Ollama会自动运行项目测试,定位失败原因,直接修改代码修复问题;•&nbsp;“Generate&nbsp;unit&nbsp;tests&nbsp;for&nbsp;this&nbsp;file”(为当前文件生成单元测试):自动分析当前文件的代码逻辑,生成覆盖核心功能的单元测试代码;2.&nbsp;文档相关指令:•&nbsp;“Update&nbsp;the&nbsp;README&nbsp;with&nbsp;the&nbsp;new&nbsp;API&nbsp;changes”(根据新的API变更更新README文档):自动识别项目API的更新内容,同步修改README文档,确保文档与代码一致;3.&nbsp;代码迭代指令:•&nbsp;支持“优化当前函数性能”“重构代码结构”“添加注释”等自定义指令,Ollama会根据指令自主编辑代码文件,完成迭代优化。3.3&nbsp;功能优势:Agent模式重构本地AI开发流程Agent模式的推出,彻底改变了本地大模型在开发中的角色,核心优势体现在三个方面:•&nbsp;任务自动化:将开发者从重复、繁琐的开发任务中解放,例如测试修复、文档更新、代码生成等,大幅提升开发效率;•&nbsp;上下文感知:基于VS&nbsp;Code的项目上下文,Ollama可精准理解项目结构、代码逻辑与开发需求,执行的操作更贴合实际开发场景;•&nbsp;全流程协同:从代码编写、测试到文档维护,Agent模式覆盖开发全流程,实现AI与开发工具的深度协同,打造“一站式”智能开发体验。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务