ural 1269. Obscene Words Filter

1269. Obscene Words Filter

Time limit: 0.5 second
Memory limit: 8 MB

There is a problem to check messages of web-board visitors for the obscene words. Your elder colleagues commit this problem to you. You are to write a program, which check if there is at least one obscene word from the given list in the given text as a substring.

Input

The first line consists of integer n (1 ≤ n ≤ 10000) — an amount of words. The next n lines contain the list of words that we can’t allow to use in our well-educated society. A word may contain any symbol but the ones with codes 0, 10 and 13. The length of each word doesn’t exceed 10000 symbols. The total list of words doesn’t exceed 100 KB. Then there is an integer m — the number of lines of the text. A size of the text doesn’t exceed 900 KB.

Output

the number of line and the number of position separated with a space, where an obscene word occurs for the first time. If there are no obscene words, output “Passed”.

Sample

input output
5
dear
sweetie
angel
dream
baby
8
Had I the heavens‘ embroidered cloths,
Enwrought with golden and silver light,
The blue and the dim and the dark cloths
Of night and light and the half-light,
I would spread the cloths under your feet:
But I, being poor, have only my dreams;
I have spread my dreams under your feet;
Tread softly because you tread on my dreams.
6 33

Problem Author: Pavel Atnashev
Problem Source: Ural State University championship, October 25, 2003

Tags: string algorithms  (hide tags for unsolved problems)

Difficulty: 832

题意:问在文章中第一次出现禁忌单词的地方

分析:AC自动机,但这题卡时间卡内存

链表?边目录?No,卡时间

数组?对了一半,卡空间

所以,只能动态的分配孩子的空间

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <iostream>
  4 using namespace std;
  5 #define For(i, s, t) for(int i = (s); i <= (t); i++)
  6 #define INF (1000000001)
  7
  8 const int N = 150010;
  9 struct TreeType
 10 {
 11     char C;
 12     int Next;
 13     int *Child;
 14     unsigned short Len, CLen, Size;
 15 } Tree[N];
 16 //int First[N], To[N], Next[N], Tot;
 17 int n, m, Cnt, Ans = INF;
 18 char Str[N * 6];
 19 int Q[N];
 20
 21 /*inline void Insert(int u, int v)
 22 {
 23     Tot++;
 24     To[Tot] = v, Next[Tot] = First[u];
 25     First[u] = Tot;
 26 }*/
 27
 28 inline void Updata(TreeType &T)
 29 {
 30     T.Size += 3;
 31     int *p = new int[T.Size + 1];
 32     for(int i = 0; i < T.CLen; i++) p[i] = T.Child[i];
 33     delete []T.Child;
 34     T.Child = p;
 35 }
 36
 37 inline void Ins(char *Str)
 38 {
 39     int Length = strlen(Str + 1), x = 0, Tab;
 40     bool Flag;
 41     For(i, 1, Length)
 42     {
 43         Flag = 0;
 44         /*for(Tab = First[x]; Tab; Tab = Next[Tab])
 45             if(Tree[To[Tab]].C == Str[i])
 46             {
 47                 Flag = 1;
 48                 x = To[Tab];
 49                 break;
 50             }*/
 51         for(Tab = 0; Tab < Tree[x].CLen; Tab++)
 52             if(Tree[Tree[x].Child[Tab]].C == Str[i])
 53             {
 54                 Flag = 1, x = Tree[x].Child[Tab];
 55                 break;
 56             }
 57         if(!Flag)
 58         {
 59             //Insert(x, ++Cnt);
 60             if(Tree[x].CLen >= Tree[x].Size) Updata(Tree[x]);
 61             Tree[x].Child[Tree[x].CLen++] = ++Cnt;
 62             Tree[Cnt].C = Str[i], x = Cnt;
 63         }
 64     }
 65     Tree[x].Len = Length;
 66 }
 67
 68 inline void Input()
 69 {
 70     scanf("%d", &n);
 71     getchar();
 72     For(i, 1, n)
 73     {
 74         gets(Str + 1);
 75         Ins(Str);
 76     }
 77 }
 78
 79 inline void Build()
 80 {
 81     int Head = 1, Tail = 0;
 82     int u, v, Tab, k, vv;
 83     //for(Tab = First[0]; Tab; Tab = Next[Tab])
 84     for(Tab = 0; Tab < Tree[0].CLen; Tab++)
 85         Q[++Tail] = Tree[0].Child[Tab];
 86     while(Head <= Tail)
 87     {
 88         u = Q[Head++];
 89         //for(Tab = First[u]; Tab; Tab = Next[Tab])
 90         for(Tab = 0; Tab < Tree[u].CLen; Tab++)
 91         {
 92             v = Tree[u].Child[Tab];
 93             if(!v) continue;
 94             //for(k = First[Tree[u].Next]; k; k = Next[k])
 95             for(k = 0; k < Tree[Tree[u].Next].CLen; k++)
 96                 if(Tree[vv = Tree[Tree[u].Next].Child[k]].C == Tree[v].C)
 97                 {
 98                     Tree[v].Next = vv;
 99                     if(Tree[v].Len < Tree[vv].Len)
100                         Tree[v].Len = Tree[vv].Len;
101                     break;
102                 }
103             Q[++Tail] = v;
104         }
105     }
106 }
107
108 inline void Solve()
109 {
110     //printf("%d\n", Cnt);
111     Build();
112     scanf("%d", &m), getchar();
113     int Length, x, Tab;
114     bool Flag;
115     For(Now, 1, m)
116     {
117         gets(Str + 1);
118         Length = strlen(Str + 1), x = 0;
119         For(i, 1, Length)
120         {
121             do
122             {
123                 Flag = 0;
124                 //for(Tab = First[x]; Tab; Tab = Next[Tab])
125                 for(Tab = 0; Tab < Tree[x].CLen; Tab++)
126                     if(Tree[Tree[x].Child[Tab]].C == Str[i])
127                     {
128                         x = Tree[x].Child[Tab], Flag = 1;
129                         break;
130                     }
131                 if(!Flag)
132                 {
133                     x = Tree[x].Next;
134                     continue;
135                 }
136                 if(Tree[x].Len)
137                 {
138                     if(Ans > i - Tree[x].Len + 1) Ans = i - Tree[x].Len + 1;
139                 }
140                 break;
141             } while(x);
142
143         }
144         if(Ans != INF)
145         {
146             printf("%d %d\n", Now, Ans);
147             return;
148         }
149     }
150     printf("Passed\n");
151 }
152
153 int main()
154 {
155     freopen("F.in", "r", stdin);
156     freopen("F.out", "w", stdout);
157     Input();
158     Solve();
159     return 0;
160 }

时间: 2024-10-13 16:22:14

ural 1269. Obscene Words Filter的相关文章

JavaScript Array --&gt;map()、filter()、reduce()、forEach()函数的使用

题目: 1.得到 3000 到 3500 之内工资的人. 2.增加一个年龄的字段,并且计算其年龄. 3.打印出每个人的所在城市 4.计算所有人的工资的总和. 测试数据: function getData() { var arr = [{ id: 1, name: 'ohzri', birth: '1999.09.09', city: '湖北', salary: 9379 }, { id: 2, name: 'rqgfd', birth: '1999.10.28', city: '湖北', sal

Jsp通过Filter实现UrlRewriter原理

web.xml文件: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&q

JQ中find()与filter()的区别

刚开始学的时候,对于find()和filter()有点理不清楚,下面通过案例相信就可以很快的区分清楚 以下是代码 find弹出的是 filter()弹出的是 下面我们添加div的class是rain find()弹出结果是 fliter弹出结果是 通过以上案例,我们就清楚的知道,find()是查找某个元素内部的元素 filter()查找的是某个元素的自身,而不是内部的元素

spark 教程三 spark Map filter flatMap union distinct intersection操作

RDD的创建 spark 所有的操作都围绕着弹性分布式数据集(RDD)进行,这是一个有容错机制的并可以被并行操作的元素集合,具有只读.分区.容错.高效.无需物化.可以缓存.RDD依赖等特征 RDD的创建基础RDD 1.并行集合(Parallelized Collections):接收一个已经存在的Scala集合,然后进行各种并行运算 var sc=new SparkContext(conf) var rdd=sc.parallelize(Array(2,4,9,3,5,7,8,1,6)); rd

struts2 版本所导致的 Filter 不同

过了好久又重新接触Struts2,使用maven直接获取的struts2-core-2.5.1的包,从网上直接copy了一段web.xml中的Filter,结果报错,struts2.3.x  以后用以下配置: 1 <filter> 2 <filter-name>struts2</filter-name> 3 <filter-class> 4 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExe

web.xml 中的listener、filter、servlet加载及一些配置

在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter.最终得出的结论是:listener -> filter -> servlet 同时还存在着这样一种配置节:context-param,它用于向 Servlet

Java Web开发——Filter过滤器

一.过滤器 1.1定义 过滤器是一个服务器端的组件,它可以截取用户端的请求与响应信息,并对这些信息进行过滤. 1.2工作原理 1.项目启动时,从Web容器中加载过滤器: 2.过滤器存在于用户请求和Web资源之间: 3.用户请求和Web响应之间的收发都经由过滤器按照过滤规则进行过滤筛选. 1.3过滤器的生命周期 实例化(web.xml加载)→初始化(init方法)→过滤(doFilter方法)→销毁(destroy方法) 1.初始化:当容器第一次加载该过滤器时,init() 方法将被调用.该类在这

【JavaWeb学习】过滤器Filter

一.简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过Filter技

Python-lambda函数,map函数,filter函数

lambda函数主要理解: lambda 参数:操作(参数). lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值.lambda语句构建的其实是一个函数对象 map函数: map(function_to_apply, list_of_inputs).map函数可以把list_of_inputs内的对象依次输入到function_to_apply中进行操作. filter函数: filter(function_to_apply, list_of_inputs).Filter