856B - Similar Words

题意

如果一个字符串可以通过去掉首位字母得到另一个字符串,则称两个字符串相似。

给出一个字符串集合,求一个新的字符串集合,满足新集合里的字符串是原字符串集合中的字符串的前缀且字符串两两不相似,问新集合里字符串的最大数量。

分析

注意到字符串都是基于原串的前缀,考虑用 \(Trie\) 优化,可以高效存储所有的前缀串。考虑相似的定义,一个较长串的相似串是可以唯一确定的(去掉首字母),通过这个关系,我们可以把两个字符串连边,最终我们可以构造出一棵树,考虑题目所求,那么我们实际上求得的是子串的集合大小减去树上的最小点覆盖集的大小,利用 树形DP 求解。

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e6 + 10;
vector<string> v;
vector<int> G[MAXN];
int nxt[MAXN][26], val[MAXN], vis[MAXN], dp[MAXN][2];
int root, L, cnt;
int newnode() {
memset(nxt[L], -1, sizeof nxt[L]);
return L++;
}
void init() {
L = 0;
root = newnode();
}
void clear() {
cnt = 0;
for(int i = 0; i < L; i++) {
val[i] = vis[i] = 0;
G[i].clear();
}
}
void insert(string S) {
int now = root;
for(int i = 0; i < S.length(); i++) {
int d = S[i] - 'a';
if(nxt[now][d] == -1) {
nxt[now][d] = newnode();
}
now = nxt[now][d];
if(!val[now]) cnt++;
val[now] = 1;
}
}
int query(string S) {
int now2 = nxt[root][S[0] - 'a'], now = root;
for(int i = 1; i < S.length(); i++) {
now = nxt[now][S[i] - 'a'];
now2 = nxt[now2][S[i] - 'a'];
if(now == -1) break;
if(!vis[now2] && val[now]) {
vis[now2] = 1;
G[now].push_back(now2);
G[now2].push_back(now);
}
}
}
void dfs(int fa, int u) {
vis[u] = 1;
dp[u][0] = 0; dp[u][1] = 1;
for(int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
if(v != fa) {
dfs(u, v);
dp[u][1] += min(dp[v][0], dp[v][1]); // 将当前点加入点覆盖集中
dp[u][0] += dp[v][1]; // 当前点不加入点覆盖集
}
}
} int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int T;
cin >> T;
while(T--) {
v.clear();
init();
int n;
cin >> n;
for(int i = 0; i < n; i++) {
string s;
cin >> s;
v.push_back(s);
insert(s);
}
for(int i = 0; i < n; i++) {
query(v[i]);
}
int rt = 1;
for(int i = 0; i < L; i++) vis[i] = 0;
for(int i = 0; i < L; i++) {
if(!vis[i] && G[i].size() > 0) {
dfs(i, i);
cnt -= min(dp[i][0], dp[i][1]);
}
}
cout << cnt << endl;
clear();
}
return 0;
}

Codeforces 856B - Similar Words的更多相关文章

  1. Codeforces 1090D - Similar Arrays - [思维题][构造题][2018-2019 Russia Open High School Programming Contest Problem D]

    题目链接:https://codeforces.com/contest/1090/problem/D Vasya had an array of n integers, each element of ...

  2. codeforces#1257 F. Make Them Similar ( 经典中间相遇问题 )

    题目链接: http://codeforces.com/contest/1257/problem/F 题意: 给出$n$个30位整数 找到一个数,让它与这$n$个数分别异或,得到的$n$个数二进制1的 ...

  3. Codeforces Round #Pi (Div. 2) 567E President and Roads ( dfs and similar, graphs, hashing, shortest paths )

    图给得很良心,一个s到t的有向图,权值至少为1,求出最短路,如果是一定经过的边,输出"YES",如果可以通过修改权值,保证一定经过这条边,输出"CAN",并且输 ...

  4. Educational Codeforces Round 76 (Rated for Div. 2)F - Make Them Similar

    题意: 给你n个数字(<230),求出一个数字使得所有数字^这个数字之后,二进制状态下的1的个数相同. 解析: 因为最大数字二进制数有30位,所以分为前15位和后15位,分别枚举0-1<& ...

  5. CodeForces 527B Error Correct System

    Error Correct System Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I6 ...

  6. CodeForces 148B Escape

    Escape Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  7. Codeforces Round #342 (Div. 2) B. War of the Corporations 贪心

    B. War of the Corporations 题目连接: http://www.codeforces.com/contest/625/problem/B Description A long ...

  8. CodeForces 173A Rock-Paper-Scissors 数学

    Rock-Paper-Scissors 题目连接: http://codeforces.com/problemset/problem/173/A Description Nikephoros and ...

  9. Codeforces Round #310 (Div. 2) B. Case of Fake Numbers 水题

    B. Case of Fake Numbers Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/5 ...

随机推荐

  1. 【题解】AHOI2009中国象棋

    还记得第一次看见这题的时候好像还是联赛前后的事了,那时感觉这题好强……其实现在看来蛮简单的,分类讨论一下即可.题意非常的简单:每一行,每一列都不能超过两个棋子.考虑我们的dp,如果一行一行转移的话行上 ...

  2. [洛谷P3803] 【模板】多项式乘法(FFT, NTT)

    题目大意:$FFT$,给你两个多项式,请输出乘起来后的多项式. 题解:$FFT$,由于给的$n$不是很大,也可以用$NTT$做 卡点:无 C++ Code:  FFT: #include <cs ...

  3. 工具——SVN常用命令

    SVN一般都是团队合作做一个项目所需用到的,为了是版本的统一 ;1. Check out——从服务器端取得代码    把服务器资料库里存放的某个项目代码取出来,放到本地主机中,这个动作叫做“check ...

  4. NEYC 2017 游记

    day 1:  result:    sum_rank: 11   school_rank:1   水题在你高估的时候就已经不水了   sum:有个快速乘类似快速幂:       int ans=0; ...

  5. 特殊密码锁 的通过码是:(请注意,在openjudge上提交了程序并且通过以后,就可以下载到通过码。请注意看公告里关于编程作业的说明)

    // // main.cpp // openjudge特殊密码锁 // // Created by suway on 17/11/20. // Copyright © 2017年 suway. // ...

  6. web上传组件

    uploadify  jquery插件. common-fileipload; common-io ;jar

  7. spring的普通类中如何取session和request对像

    在使用spring时,经常需要在普通类中获取session,request等对像. 比如一些AOP拦截器类,在有使用struts2时,因为struts2有一个接口使用org.apache.struts ...

  8. jquery和ajax,json写法的说明

    一: 在ajax中,如果没有用jquery,则如xmlHttpRequest.open("POST", "AjaxServlet", true); (1)如果用 ...

  9. [洛谷P3942] 将军令

    洛谷题目链接:将军令 题目背景 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人/低头 念头/却能/让人/抬头 抬头/去看/去爱/去追 你心中的梦 题目描述 又 ...

  10. Flex UI刷新后保持DataGrid中的ScrollBar的位置不变

    这是之前我发的一个贴子问题描述:http://q.cnblogs.com/q/53469/