首页 > 其他分享 >cf-edu-142.D

cf-edu-142.D

时间:2023-04-29 10:33:40浏览次数:45  
标签:15 tire int cf add edu 142

题目链接:https://codeforces.com/problemset/problem/1792/D

算法:tire树求最长公共前缀(lcp)。

反思:题目转换出的题意已大致得到,但怎么具体求不会。

思路:tire树维护一个结构,1在哪些位置出现,2在哪些位置出现,以此类推。

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 5e4+10;
int tr[N*15][15],idx;
vector<int>num[N];
int temp[15],n,k;
void add(){
    int h = 0;
    for (int i=1;i<=k;i++){
        if (!tr[h][temp[i]]) tr[h][temp[i]] = ++idx;
        h = tr[h][temp[i]];
    }
}
int query(vector<int> t){
    int h = 0;
    int ans = 0;
    for (int i=0;i<t.size();i++){
        if (tr[h][t[i]]){
            ans++;
            h = tr[h][t[i]];
        }else break;
    }
    return ans;
}
void solve(){
    cin>>n>>k;
    idx = 0;
    for (int i=0;i<=n*k;i++){
        for (int j=1;j<=10;j++) tr[i][j] = 0;
    }
    for (int i=1;i<=n;i++) num[i].clear();
    for (int i=1;i<=n;i++){
        int last = 0;
        for (int j=1;j<=k;j++){
            int x;
            cin>>x;
            num[i].push_back(x);
            temp[x] = j;
        }
        add();
    }
    for (int i=1;i<=n;i++){
        cout<<query(num[i])<<' ';
    }
    cout<<'\n';
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T;
    T = 1;
    cin>>T;
    while(T--) solve();
    return 0;
}

标签:15,tire,int,cf,add,edu,142
From: https://www.cnblogs.com/xjwrr/p/17363669.html

相关文章

  • [ABC142E] Get Everything
    2023-02-18题目题目传送门翻译翻译难度&重要性(1~10):5题目来源AtCoder题目算法状压dp解题思路我们令\(S\)表示当前箱子状态,\(P_i\)表示第\(i\)把钥匙能开的箱子。设\(f_S\)表示开启当前状态箱子的最小花费。能得到转移方程:\(f_{P_i|i}=\min(f_{P_i|i},f_i+......
  • cf-div.2-868-D
    题目链接:https://codeforces.com/contest/1823/problem/D比赛的时候关键性质已经想到,但没想到怎么正确构造。性质:每次新加一个字母,回文子串的数量最多增加1(因为题目需要不相同的回文子串)。证明:可以用反证法,易证。构造方法:由于k的值很小(只有20),所以对于不再增加(回文子串)的......
  • CF1814E Chain Chips & CF750E New Year and Old Subsequence - 动态 dp -
    一句话概括动态dp:用来解决带修改/多次区间询问的dp问题。将转移写成矩阵的形式,然后利用线段树求解区间问题/单点修改1814E注意一条边要么选2要么选0次,而且第一条边一定是选了2次。如果有一条边没选,那么这条边两侧的边一定都选了。设\(f_i\)代表考虑到第\(i\)条边,......
  • CF960F Pathwalks | 线段树优化DP
    题目设\(dp[x,w]\)为以结点\(x\)为结尾,且最后一条边边权为\(w\)的最长路径长度。考虑根据顺序加边,对于边\((u,v)\),更新\[dp[v,w]=\max_{w'<w}\{dp[u,w']\}+1\]对于每个节点,建一棵线段树,维护\(dp[x]\),这样每次更新\(dp[v,w]\)就相当于在\(dp[u]\)所对应的线段树中查询\([......
  • CF1699A The Third Three Number Problem
    题意简述构造出一个三元组a,b,c使得(a⊕b)+(a⊕c)+(b⊕c)=n,若无解输出-1。符号⊕的意思为异或个人分析首先要了解异或符号的性质:1,x⊕0=x2,x⊕x=x根据异或符号的性质可以得到一下构造:a=b=0,c=n/2c=0,a=b=n/2通过上述可以发现答案都是偶数所以若n为奇则无解......
  • 「CF1188E」Problem from Red Panda
    题目点这里看题目。给定一个长度为\(k\)的非负整数序列\(a\)。你可以对于\(a\)做如下操作任意次:选定\(1\lej\lek\),满足除了\(a_j\)外\(a\)中其它数都为正。而后,令\(a_j\)加上\(k-1\),令除了\(a_j\)外\(a\)中其它数减去\(-1\)。(这样一次操作被称为“操......
  • Educational Codeforces Round 147 (Rated for Div. 2)
    Preface补题这周比赛挺少,不过后面可能就很少有时间补以前的比赛了的说现在除了要做学校的集训专题外,还要刷一下蓝桥杯国赛的题,可以说是很忙碌了而且由于JAVA的期末考试要来了,为了熟悉下语法以后补题的时候前面的题目可能会用JAVA来写(其实我写的JAVA看起来和C++真没啥区别)A.......
  • CF1621A Stable Arrangement of Rooks
    题目简述:一个n*n的棋盘上,放上k个车,使得一任意车向上下左右移动一格(这里的车可以上下左右移动任意步数)后不与其他车相撞(注:不能走出棋盘之外)。个人分析:从题目可知,在车上下左右移动一格后不会与其他车相撞,换句话说,两辆车之间至少相隔一行一列,放在对角线上是最优想法,若无解则......
  • PYTHON REDUCE
    Reduce当需要对一个列表进行一些计算并返回结果时,Reduce是个非常有用的函数。举个例子,当你需要计算一个整数列表的乘积时。通常在python中你可能会使用基本的for循环来完成这个任务。现在我们来试试reduce:fromfunctoolsimportreduceproduct=reduce((lambdax......
  • CF1822G2 - Magic Triples
    比较好的题目,别的不说,G1对G2有着不错的启发性。首先,因为\(b>0,a_k\le10^9\),所以\(b\)不可能超过\(\sqrt{a}\)考虑对\(b\)分类讨论,设置一个阈值\(B\),先处理\(b=1\)的情况,其实就是取三个相同的数然后排列,可以比较简单的排序之后做到\(O(n)\)。接着手写一个哈希表用......