题目大意就是帮你给N条字符串,每条长度不超过20。问要将他们单一识别出来,每个字符串最短可以缩为多短。

如:

abc

abcdefg

bc

adef

这四个字符串就可分别缩写为

abc

abcd

b

ad

方法:   字典树(可以参阅http://s.acmore.net/show_article/show/58)。

另外我还用了一个bool数组last用来记录每个单一识别的字符串最短可以到哪个位置,他的下标就是字典树中每个字母对应的序号

方法如下:(以上面的为例)

当输入的字符串在某一个位置开始与之前的不同,就记录这个不同的字母(设置为true),之后的不再改变

当输入字符串的某位置在建好的树中时,把last加长(设置为true)

第一次输入:abc          last[0]=true;

第二次输入:abcdefg    last[0]=last[1]=last[2]=last[3]=true;

第三次输入:bc            last[0]=true;

第四次输入:adef         last[0]=last[1]=true;

这样一来输出端长度就分别为1、4、1、2

代码实现如下:

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <stack>
#include <set>
#include <queue>
#define MAX(a,b) (a) > (b)? (a):(b)
#define MIN(a,b) (a) < (b)? (a):(b)
#define mem(a) memset(a,0,sizeof(a))
#define INF 1000000007
#define MAXN 20005
using namespace std; int trie[MAXN][],val[MAXN],S;
bool last[MAXN];
char ma[][]; int get_num(char ch){return ch-'a';} void init()
{
mem(trie);mem(val);
mem(last);mem(ma);
S = ;
} void insert(char *s)
{
int u=,len = strlen(s);
int flag = ;
for(int i=;i<len;i++)
{
int c = get_num(s[i]);
if(!trie[u][c])
{
trie[u][c] = S;
val[u] = ;
if(flag)//如果与上面的字符串开始不一样,酒吧第一个开始不一样的位置设置为true
{
last[u]=true;
flag = ;//之后的依然是false
}
u = S;
S++;
}
else if(val[u] == )
{
u = trie[u][c];
last[u] = true;//在查找中发现与已建好的树里面相同的数,那么需要识别的字符串就要相应的加长
}
}
if(val[u]== || val[u] == )return;
else val[u] = ;
} int main()
{
init();
int T =;
while(scanf("%s",ma[T])!=EOF)
{
insert(ma[T++]);
}
for(int i=;i<T;i++)
{
printf("%s ",ma[i]);
int u=,j=;
while(last[u] && ma[i][j])
{
printf("%c",ma[i][j]);
u = trie[u][get_num(ma[i][j++])];
}
printf("\n");
}
return ;
}

最新文章

  1. 【转】el表达式的判断符
  2. 安装运行mariadb时错误:gtid_slave_pos
  3. 最实用的IT类网站及工具大集合[转]
  4. Android WebRTC 音视频开发总结(三)-- 信令服务和媒体服务
  5. 统一Matlab下不同子图的色标colorbar
  6. SQL Server中建立外键的方法
  7. 设置Eclipse启动JDK
  8. PE文件结构(四) 输出表
  9. vue-cli新版 -- 记录
  10. MySQL应用异常问题解决
  11. Netty重要概念介绍
  12. JS-cookie和正则表达式
  13. 贪吃蛇GamePanel Java实现(二)
  14. arcmap搜索脚本错误
  15. 怎样增加Dave 英语学习小组
  16. tomcat的配置和优化
  17. EventFiringWebDriver网页事件监听(一)
  18. div 超出高度滚动条,超出宽度点点点
  19. ionic真机调试Android报错 - could not read ok from ADB Server * failed to start daemon * error: cannot connect to daemon
  20. php 远程调用redis

热门文章

  1. hadoop2的automatic HA+Federation+Yarn配置的教程
  2. 使用stringstream时的清空操作
  3. Java 知识点:序列化
  4. 04day1
  5. 【转】如何在IOS中使用3D UI - CALayer的透视投影
  6. 【转】Android fill_parent和wrap_content分析
  7. window.history
  8. linux 下 NetBeans 字体大小设置
  9. Oracle 数据乱码
  10. 动画 -- ListView列表item逐个出来(从无到有)