【链接】h在这里写链接


【题意】


给你n个电话号码。
让你给每一个电话号码选定一个字符串s;
使得这个串s是这个电话号码的子串。
且不是任何一个其他电话号码的子串。
s要求最短。

【题解】


字典树。
每个电话号码,1,2,..length(s)开始的长度为length(s)...3,2,1的子串。
依次从根节点加入到字典树当中去。
然后考虑,一个子串s在另外一个字符串中出现过。
则另外一个字符串,在某个起点开始的子串加入到字典树的过程中,肯定会覆盖到s的路径。
(因为s肯定也是从根节点开始加入到字典树里面的)
则只要s没有完全被另外一个子串覆盖就好了。
->转换到字典树上,就是一条从根节点开始的路径(代表这个子串)没有被另外从根节点开始的一条路径完全覆盖就行。
那么这个子串就是只出现在i电话号码中的。
(在建字典树的时候,记录当前路径是哪个电话号码的子串就好.如果出现了重叠,就标记那个节点被覆盖了。)

【错的次数】


0

【反思】


抓住问题的本质。
思考问题中出现的矛盾点。
想想要怎么解决这个问题。

【代码】

#include <bits/stdc++.h>
using namespace std; const int N = 7e4; int n,cnt = 1;//cnt 代表总节点个数 根节点在1位置,所以开始得赋值为1
string s[N+10];
int ch[(int)400e4][10];//最多有400万个节点。实际上没那么多。
int tc[(int)400e4]; int main(){
//freopen("F:\\rush.txt","r",stdin);
ios::sync_with_stdio(0),cin.tie(0);
cin >> n;
for (int i = 1;i <= n;i++){//输入n个字符串,并且加入到AC自动机里去
//每个子串都要加进去
cin >> s[i];
int len = s[i].size();
for (int j = 0;j <= len-1;j++){//枚举起点
int now = 1;
for (int k = j;k <= len-1;k++){
int &temp = ch[now][s[i][k]-'0'];
if (temp==0) temp = ++cnt;
now = temp;//一层一层地往下走。
if (tc[now]==0)//如果这个节点之前没有出现过
tc[now] = i;//赋值这个点第一次被i走过。
else//如果之前有走过。
if (tc[now]!=i)//如果之前有被其他人走过。
//就说明这条路被多个字符串走过。
//路径有覆盖的地方
//这个now位置显然有被覆盖
tc[now] = -1;//则直接赋值为-1
//下次有个字符串到了这个位置的话。
//就不能用这个字符串。还得往下走。
//走道没有被覆盖的地方为止。
//else
}
}
}
for (int i = 1;i <= n;i++){
//每个答案都对应输出一下。
//枚举每个子串的开头。然后在字典树里走路径。
//找到第一个没有被多个字符串的子串覆盖的路径
int ans = 100;//存最后的最小长度
int id;//最后答案的起始位置
int len = s[i].size();
for (int j = 0;j <= len-1;j++){
int now = 1;
for (int k = j;k <= len-1;k++){
now = ch[now][s[i][k]-'0'];//往下走
if (tc[now]==i)//如果只有它一个人走过。则可以保证只有
//它一个字符串有这个子串
if (ans > k-j+1){
//如果答案更优
ans = k-j+1;
id = j;//记录起始位置
break;//再往后找没有意义了。break就好
}
}
}
for (int j = id;j <= id+ans-1;j++)
cout << s[i][j];
cout << endl;
}
return 0;
}

【Codeforces Round #434 (Div. 1) B】Polycarp's phone book的更多相关文章

  1. 【Codeforces Round #434 (Div. 2) B】Which floor?

    [链接]h在这里写链接 [题意] 在这里写题意 [题解] 枚举每层有多少个公寓就好. 要注意,每次都要从1到100判断,一下那个公寓该不该出现在那一层. 多个答案,如果答案是一样的.也算是唯一的.  ...

  2. 【Codeforces Round #434 (Div. 2) A】k-rounding

    [链接]h在这里写链接 [题意] 在这里写题意 [题解] 转换一下就是求n和10^k的最小公倍数. [错的次数] 0 [反思] 在这了写反思 [代码] #include <bits/stdc++ ...

  3. 【Codeforces Round #432 (Div. 1) B】Arpa and a list of numbers

    [链接]h在这里写链接 [题意] 定义bad list是一个非空的.最大公约数为1的序列.给定一个序列,有两种操作:花费x将一个元素删除.花费y将一个元素加1,问你将这个序列变为good list所需 ...

  4. 【Codeforces Round #420 (Div. 2) C】Okabe and Boxes

    [题目链接]:http://codeforces.com/contest/821/problem/C [题意] 给你2*n个操作; 包括把1..n中的某一个数压入栈顶,以及把栈顶元素弹出; 保证压入和 ...

  5. 【Codeforces Round #420 (Div. 2) B】Okabe and Banana Trees

    [题目链接]:http://codeforces.com/contest/821/problem/B [题意] 当(x,y)这个坐标中,x和y都为整数的时候; 这个坐标上会有x+y根香蕉; 然后给你一 ...

  6. 【Codeforces Round #420 (Div. 2) A】Okabe and Future Gadget Laboratory

    [题目链接]:http://codeforces.com/contest/821/problem/A [题意] 给你一个n*n的数组; 然后问你,是不是每个位置(x,y); 都能找到一个同一行的元素q ...

  7. 【Codeforces Round #423 (Div. 2) C】String Reconstruction

    [Link]:http://codeforces.com/contest/828/problem/C [Description] 让你猜一个字符串原来是什么; 你知道这个字符串的n个子串; 且知道第i ...

  8. 【Codeforces Round #423 (Div. 2) B】Black Square

    [Link]:http://codeforces.com/contest/828/problem/B [Description] 给你一个n*m的格子; 里面包含B和W两种颜色的格子; 让你在这个格子 ...

  9. 【Codeforces Round #423 (Div. 2) A】Restaurant Tables

    [Link]:http://codeforces.com/contest/828/problem/A [Description] 有n个组按照时间顺序来餐馆; 每个组由一个人或两个人组成; 每当有一个 ...

随机推荐

  1. Annotation中Result的params属性

    这个属性只有在重定向时有用,而转发时不会设置参数. 如: @Results({ @Result(name="success", location="page", ...

  2. C++ Primer高速入门之六:数组和指针

    更新:勘误,delete [] 猪 我们知道,C语言以及早期的面向结构的语言差点儿都支持数组定义.比方整形数组int 女神[2].表示有俩数: 女神[0], 女神[1].她们都是整数. C++ 语言为 ...

  3. webgoat 7.1 实战指南

    WSASP中文文档参考链接: http://www.owasp.org.cn/owasp-project/2017-owasp-top-10 OWASP Top 10 2017中文版V1.3http: ...

  4. colorscheme-如何vim颜色风格

    我们vim默认的风格是黑底的,如果我们想要更换其他的风格,比如字体高亮的颜色.注释的颜色等.这时候我们就需要一个属性了,如下 colorscheme darkblue 这个属性的值,其实是在 /usr ...

  5. ubuntu14.04-安装flash

    最近打开搜狐等在线视频,都提示我说flash没有安装,然后就点击安装.进入安装界面 如下所示 然后我们选择版本.之前我一直都是选择版本APT,因为里面标注的是适用于ubuntu10.04+,这时候它会 ...

  6. Tools-->SQL Server Profiler监视数据库

    http://www.cnblogs.com/lorking/p/4062787.html https://docs.microsoft.com/en-us/sql/tools/sql-server- ...

  7. amaze ui响应式辅助

    amaze ui响应式辅助 响应式辅助 就是不同的显示屏幕,或者手机的横竖屏,你可以控制栏目的显影,还是挺有帮助的 视口大小 .am-[show|hide]-[sm|md|lg][-up|-down| ...

  8. Entity Framework的原理及使用方式

    ADO.NET Entity Framework操作数据库的过程对用户是透明的(当然我们可以通过一些工具或方法了解发送到数据库的SQL语句等).我们唯一能做的是操作EDM,EDM会将这个操作请求发往数 ...

  9. JS实现下拉菜单的功能

    <!DOCTYPE html> <html> <head> <meta charset = "utf8"> <title> ...

  10. python 数字计算模块 decimal(小数计算)

    from decimal import * a = Decimal('0.1')+Decimal('0.1')+Decimal('0.1')+Decimal('0.3') float(a) >& ...