第八集 你明明自己也生病了,却还是要陪着我

第八集 你明明自己也生病了,却还是要陪着我

TimeLimit:3000ms  MemoryLimit:256000KB
64-bit integer IO format:%lld
 
Problem Description

    小A由于太投入了没有发现小C醒来,就假装很生气,责备她说“都病这么重了还沉迷上网,刚刚病醒就玩电脑,你还要不要命了,我刚刚担心死了。如果被毒死了,我会内疚死的,毕竟是我害了你,都是我不好。请你原谅我,这些天我会好好照顾你的,不要担心,好好养病,等你好了我还帮你拍照!”。“你也病得这么重,我不用你照顾,你好好照顾好自己吧!”小C现在只想一个人独处好发邮件。

    “好吧,那你好好睡觉,我刚刚只想帮你关下电脑,不许玩电脑喽!”小A说着把电脑合上放在床边就走出了房间。

    小A思索着刚才看到的一些信件内容,心想她不是说自己父母双亡怎么会有人称呼她女儿呢?他哥上次难道也是给她安排任务?那个罗马地图怎么会是藏宝图?肯定有很多秘密在其中,一定要调查清楚,难道是小C进入什么传销组织了?或者从小被拐进犯罪团伙?…越想越为小C的处境感到担心,便决定帮助小C脱离虎口。

    住院一周多,小A对小C无微不至的照顾,让小C慢慢地喜欢上了小A,但是她心里知道他们是不可能在一起的。因为她知道自己父亲是有关部门的领导,正在派她办一件关于国家机密的大事,所以要隐瞒一切,办完就消失。

    小A在这段时间内获取了小C电脑中的全部邮件,当然这种做法不是正人君子所为,但是他为了能够救小C脱离迷惑只好为之。让他震惊的是原来小C的父亲派她来引诱他破解藏宝图的秘密,骗小C说是国家机密所以要隐瞒一切,那个国际编程比赛就是她父亲办的。小A不由心疼小C,原来她真是很傻很天真。她父亲为了满足自己的私欲竟然连女儿都可以欺骗,这种人就不该活在世上。

    小C收到指示要尽快破解密码,因此小C打电话叫小A过来一起陪她聊天。

    “上次真是危险,以后可不能出去乱吃了。”小C笑着说。

    “是啊!对了,上次都还来得及看翻译罗马数字后的结果是怎样的呢!”,小A想再好好看看地图。

    “那我们拿出来看看!”小C说着打开电脑输入两张地图,显示出了那些相同区域翻译后的文字。

    那是一个个单词,乍看也看不出什么意思,因为有些单词还是不认识。比如一个是cen,一个是ter。

    “center!”小A突然有所发现,接着说“会不会是拼起来看的?”

    “那也不对呀,betent和ftcause怎么拼呀!”小C问到。“可以拼成because啊!”小A突然兴奋起来。

    “会不会是这些字符串能够拼出来的城市名就是宝藏有可能埋藏的地方?”小C似乎明白了。

    “对呀!我们查看每个城市名称是不是这些字符串中单个字符串的前后缀合并组成,或者是取两个字符串的前后缀组成。”

    “太好了,赶紧写个程序出来试试!”小C兴奋地说!

    小A看着小C,看着她一脸开心的样子,不由心里觉得有点伤心就不太想写,你们帮他写吧。

广告时间:“古哥”提醒你,作为专业的技术人员告诉你这个程序该如何写!首先要写一个添加字符串操作,比如说我输入“1 abc”就是添加字符串abc。然后写查询城市名称操作比如说我输入“2 abcabc”就是查询abcabc是否是所有添加过的字符串中前后缀组合(或本身就是某单词的前缀或后缀),输出“YES”或“NO”。字符串不会超过100个字符!操作总数不超过50000个。

    过了一会儿,程序写好了运行了下,三个城市的名字就出现了。小C连忙激动地夺过电脑,认真看着这三个城市的名字。

Input

 多组测试数据

每组的第一行是一个n
接下来n行
每行是一个数字k和字符串s
k表示操作类型,s表示操作字符串
Output

 对于每个2操作输出YES/NO

SampleInput
8
1 abc
2 abcabc
1 qwer
2 ar
2 qwer
2 abcqwer
2 qb
2 we
SampleOutput
YES
YES
YES
YES
NO
NO

思路:构造两个字典树,一个前缀树,一个后缀树。添加字符串时,先将字符串插入到前缀树中,将字符串翻转后插入到后缀树中。查询字符串时,在前缀树和后缀树中分别查询该字符能到达的长度len1 、len2,如果两个长度相加大于
查询的字符串长度,那么就是YES,否则就是NO;
 1 #include <stdio.h>
 2 #include<algorithm>
 3 #include <string.h>
 4 #include <iostream>
 5 using namespace std;
 6 int val[500005];///数组大小为每个单词字符长度*单词数量
 7 
 8 struct Tree
 9 {
10     int tree[500005][26], tmp=1;
11     void init()
12     {
13         tmp=1;
14         memset(tree, 0, sizeof (tree));
15     }
16     void addtrees(char a[])
17     {
18         int rt = 0, x,ln;
19         ln=strlen(a);
20         for (int i = 0; i<ln ; i++)
21         {
22             x = a[i] - 'a';
23             if (tree[rt][x] == 0)
24             {
25                 memset(tree[tmp],0,sizeof(tree[tmp]));
26                 tree[rt][x] = ++tmp;///下一个结点位置
27             }
28             rt = tree[rt][x];
29         }
30     }
31     int findtrees(char b[])
32     {
33         int rt = 0, x,len=0;
34         int ln = strlen(b);
35         for (int i = 0; i < ln; i++)
36         {
37             x = b[i] - 'a';
38             if (tree[rt][x] == 0)
39             {
40                 return len;
41             }
42             rt = tree[rt][x];
43             len++;
44         }
45         return len;
46     }
47 
48 } p,q;
49 
50 int main()
51 {
52 
53     int n,op;
54     while(~scanf("%d",&n))
55     {
56         p.init(),q.init();
57         while(n--)
58         {
59             char str[120];
60             scanf("%d %s",&op,str);
61             int len=strlen(str);
62             if(op==1)
63             {
64                 p.addtrees(str);
65                 reverse(str,str+len);
66                 q.addtrees(str);
67             }
68             else
69             {
70                 int len1=p.findtrees(str);
71                 reverse(str,str+len);
72 
73                 int len2=q.findtrees(str);
74                 if(len1+len2>=len)
75                     puts("YES");
76                 else
77                     puts("NO");
78             }
79         }
80 
81     }
82     return 0;
83 }

猜你喜欢

转载自www.cnblogs.com/yuanlinghao/p/10434618.html