• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
jacklee404
Never Stop!
博客园    首页    新随笔    联系   管理    订阅  订阅
#edu142-D.Fixed Prefix Permutations Trie树

题目

D.Fixed Prefix Permutations

思路

​ Trie数,顺便处理以下映射数组

Code

#include <bits/stdc++.h>

using i64 = long long;

const int N = 5e5 + 10;

int nex[N][15], cnt;
bool exist[N];  // 该结点结尾的字符串是否存在

void insert(std::vector<int> &t, int l) {  // 插入字符串
	int p = 0;
	for (int i = 1; i <= l; i++) {
	  int c = t[i];
	  if (!nex[p][c]) nex[p][c] = ++cnt;  // 如果没有,就添加结点	  
    p = nex[p][c];
	}
	exist[p] = 1;
}

int query(std::vector<int> &t, int l) {  // 查找字符串
	int p = 0;
	for (int i = 1; i <= l; i++) {
	  int c = t[i];
	  if (!nex[p][c]) return i - 1;
	  p = nex[p][c];
	}
	return l;
}

void solve() {
	int n, m;

	std::cin >> n >> m;

	for(int i = 0; i < cnt; i ++) {
		memset(nex[i], 0, sizeof nex[i]);
	}

	cnt = 0;

	std::vector<std::vector<int>> a(n, std::vector<int>(m + 1));

	for(int i = 0; i < n; i ++) {
		std::vector<int> t(m + 1);
		for(int j = 1; j <= m; j ++) {
			std::cin >> a[i][j];
			t[a[i][j]] = j;
		}
		insert(t, m);
	}

	for(int i = 0; i < n; i ++) {
		std::cout << query(a[i], m) << " \n"[i == n - 1];
	}
}

int main() {
	int _;
	std::cin >> _;
	while(_ --) {
		solve();
	}
}
posted on 2023-01-29 19:39  Jack404  阅读(19)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3