摘要: 额,这题,我好想看到分类说是用trie树,可是怎么想也没什么思路,就用了暴力了若找不到相同的单词,则相似的也只有三种情况代码很好理解#include<iostream>using namespace std;#define MAXN 10001char str[MAXN][20];bool replace(char *a,char *b){ int l1=strlen(a); int l2=strlen(b); if(l1==l2)//修改一个字符 { int i=0; while(i<l1&&a[i]==b[i])//找到第一个不同的字符的位置 i++; w 阅读全文
posted @ 2011-05-15 20:41 枕边梦 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 唉,又这样贡献了一个WA,忘了把自己的用来测试的输出删了……一开始还真被这题目吓住了,不过花点心思想想,还是可以做出来的题意要求的是打印单词的最少操作数只有三个操作:输入,删除,还有打印,前缀就不需要重复输入,想到了字典树,这道题目也就好做了要 求最少的操作数,所以首先要归类,所有拥有相同前缀的单词,放在一块输入,题目还说,最后一次打印不需要删除理论上是像上面说的,但实际我们在计算最少操作数时,可以这样算,首先假设所有的单词都需要重新打印还有删除,所以总操作数是单词总长度*2接下来,计算出前缀,可以这样想,只需计算出每一个节点被哪些单词共有,如题目中的样例,“freeradiant”,“fre 阅读全文
posted @ 2011-05-15 18:07 枕边梦 阅读(1110) 评论(0) 推荐(0) 编辑
摘要: 额,比较简单的字典树,找出一个单词最短而且唯一的前缀,就是不会跟其他单词重复这样的话,插入只需在每一个单词经过的路径的节点p->v上累加,查找时,检查p->v的值,当p->==1时,即到此节点为止的前缀是最短而且是唯一的不知道大牛的0ms是怎么做出来的,,我用了16ms,膜拜啊#include<iostream>#include<string>using namespace std;struct node{ node *next[26]; int v;};node *root;char str[1001][21];void insert(char *s 阅读全文
posted @ 2011-05-15 14:55 枕边梦 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 一道水题,居然改错改了一个多小时题目的意思是其实就是找出一个单词,前半部是一个出现过的单词,后半部也是,记住,要严格满足这个条件所以,其实也就是先查找一个单词的是否有前缀,再用这个单词除去前缀的部分查找是否存在一个这样的单词虽然题目说按字典序输出,但本身已经是按字典序输入了,所以排序也就省了#include<iostream>#include<string>using namespace std;struct node{ int v; node *next[26];};node *root;char str[50002][50];void insert(char *s) 阅读全文
posted @ 2011-05-15 14:15 枕边梦 阅读(1503) 评论(1) 推荐(0) 编辑
摘要: 这题花的时间还真是不少呀,而且还是参考大牛思路的题意:首先将字典保存,然后对应输入的message的每一个数字,输出频率最大的前缀,若没有,则输出MANUALLY主要运用到了俩方面的知识,栈还有字典树,栈的实现主要是保存未遍历过节点,方便回溯这里主要有俩个地方需要注意一下:其一,就是每个单词中字母的频率,比如:“hell,3”和“hello ,4”,则前缀相同时,h的频率为4+3=7其二,就是在利用栈进行回溯,首先将输入的串中对应的每一个数字调用find()函数查找最大频率的前缀,查找过程中,其实这里相当于深搜了,注意体会栈的思想#include<iostream>#include 阅读全文
posted @ 2011-05-15 10:41 枕边梦 阅读(1063) 评论(0) 推荐(0) 编辑