HDU 2222 Keywords Search(查询关键字)
HDU 2222 Keywords Search(查询关键字)
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 131072/131072 K (Java/Others)
|
【Description】 |
【题目描述】 |
|
In the modern time, Search engine came into the life of everybody like Google, Baidu, etc. Wiskey also wants to bring this feature to his image retrieval system. Every image have a long description, when users type some keywords to find the image, the system will match the keywords with description of image and show the image which the most keywords be matched. To simplify the problem, giving you a description of image, and some keywords, you should tell me how many keywords will be match. |
当今社会,诸如谷歌,百度等搜索引擎不断深入人心。 Wiskey想把这个功能加入他的图片搜索系统。 每张图都有一串很长的描述,当用户输入一些关键字去搜索图片时,系统会匹配描述图片的关键字并显示有最多关键字匹配的图片。 |
|
【Input】 |
【输入】 |
|
First line will contain one integer means how many cases will follow by. Each case will contain one integers N means the number of keywords and N keywords follow. (N <= 10000) Each keyword will only contains characters 'a'-'z', and the length will be not longer than 50. The last line is the description, and the length will be not longer than 1000000. |
第一行有一个整数随后测试用例数量。 每个测试用例。 每个测试用例有一个整数N表示关键字数量与随后有N个关键字。(N <= 10000) 每个关键字只包含字符'a'-'z',并且其长度不大于50。 最后一行是此图片的描述,并且其长度不大于1000000。 |
|
【Output】 |
【输出】 |
|
Print how many keywords are contained in the description. |
输出描述中包含的关键字数量。 |
|
【Sample Input - 输入样例】 |
【Sample Output - 输出样例】 |
|
1 5 she he say shr her yasherhs |
3 |
【题解】
AC自动机入门题,不过数据不全面,里面没有考虑回头匹配子串情况的数据(个人觉得这是KMP的AC自动机的主要不同之处,Trie图不会,哪天被打脸了再说)
例如:
1
2
abc
b
abc
输出1的代码居然也能A……而且貌似这个问题被提出来很久了,一直没有改善。
注意匹配的是关键字数量,关键字可以相同,不过可以看成匹配一个关键字就去掉一个关键字。
【代码 C++】
#include <cstdio>
#include <cstring>
#include <queue>
struct Node{
int next[], fail, isWord;
}tr[];
int it;
char text[]; void build(){
it = ;
memset(tr, , sizeof(tr));
int n, i, j, w;
char word[];
scanf("%d", &n), getchar();
while (n--){
gets(word);
for (i = j = ; word[i]; ++i){
w = word[i] - 'a';
if (!tr[j].next[w]) tr[j].next[w] = ++it;
j = tr[j].next[w];
}
++tr[j].isWord;
}
}
void setFail(){
std::queue<int> q, last;
int now, pre, next, i, j;
for (i = ; i < ; ++i){
if (tr[].next[i]) q.push(tr[].next[i]), last.push();
} while (!q.empty()){
now = q.front(); q.pop();
pre = last.front(); last.pop();
for (i = ; i < ; ++i){
next = tr[now].next[i];
if (next){
q.push(next);
if (tr[pre].next[i]) j = pre;
else j = ;
if (tr[j].next[i]){
tr[next].fail = tr[j].next[i];
last.push(tr[j].next[i]);
}
else last.push();
}
}
}
}
int fid(){
gets(text);
int i, iTR, opt, w, temp;
for (i = iTR = opt = ; text[i]; ++i){
w = text[i] - 'a';
if (tr[iTR].next[w]) iTR = tr[iTR].next[w];
else{
if (iTR) --i;
iTR = tr[iTR].fail;
}
for (temp = iTR; ~tr[temp].isWord; temp = tr[temp].fail){
opt += tr[temp].isWord;
tr[temp].isWord = -;
}
}
return opt;
}
int main(){
int t;
scanf("%d", &t);
while (t--){
build();
setFail();
printf("%d\n", fid());
}
return ;
}
自己面向图片编程的代码……
#include <cstdio>
#include <cstring>
#include <queue>
struct Node{
int next[], fail, isWord;
}tr[];
int it; void build(){
it = ;
memset(tr, , sizeof(tr));
int n, i, j, w;
char word[];
scanf("%d", &n), getchar();
while (n--){
gets(word);
for (i = j = ; word[i]; ++i){
w = word[i] - 'a';
if (!tr[j].next[w]) tr[j].next[w] = ++it;
j = tr[j].next[w];
}
++tr[j].isWord;
}
}
void setFail(){
std::queue<int> q;
int now, next, i;
for (i = ; i < ; ++i) if (tr[].next[i]) q.push(tr[].next[i]); while (!q.empty()){
now = q.front(); q.pop();
for (i = ; i < ; ++i){
if (next = tr[now].next[i]){
q.push(next);
tr[next].fail = tr[tr[now].fail].next[i];
}
else tr[now].next[i] = tr[tr[now].fail].next[i];
}
}
}
int fid(){
char text[];
gets(text);
int i, iTR, opt, temp;
for (i = iTR = opt = ; text[i]; ++i){
iTR = tr[iTR].next[text[i] - 'a'];
for (temp = iTR; ~tr[temp].isWord; temp = tr[temp].fail){
opt += tr[temp].isWord;
tr[temp].isWord = -;
}
}
return opt;
}
int main(){
int t;
scanf("%d", &t);
while (t--){
build();
setFail();
printf("%d\n", fid());
}
return ;
}
参考kuangbin巨后稍微简化的代码
HDU 2222 Keywords Search(查询关键字)的更多相关文章
- HDU 2222 Keywords Search(AC自动机模版题)
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- HDU 2222 Keywords Search(瞎搞)
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- hdu 2222 Keywords Search ac自己主动机
点击打开链接题目链接 Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- hdu 2222 Keywords Search 模板题
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- hdu 2222 Keywords Search - Aho-Corasick自动机
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...
- hdu 2222 Keywords Search ac自动机入门
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:有N(N <= 10000)个长度不超过50的模式串和一个长度不超过1e6的文本串. ...
- hdu 2222 Keywords Search
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 思路:裸AC自动机,直接贴代码做模板 #include<stdio.h> #includ ...
- HDU 2222 Keywords Search(AC自动机模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:给出多个单词,最后再给出一个模式串,求在该模式串中包含了多少个单词. 思路: AC自动机的模板题. ...
- 【刷题】HDU 2222 Keywords Search
Problem Description In the modern time, Search engine came into the life of everybody like Google, B ...
随机推荐
- FastJson--阿里巴巴公司开源的速度最快的Json和对象转换工具(转)
本文转自:http://blog.csdn.net/djun100/article/details/24237371 这是关于FastJson的一个使用Demo,在Java环境下验证的 class U ...
- 161031、java.util.StringTokenizer使用及源码
import java.util.StringTokenizer; public class TestStringTokenizer { public static void main(String[ ...
- Mysql备份与还原实例
一.备份数据库 ----清空一下日志 mysql> reset master; Query OK, rows affected (0.02 sec) ----查看一下echo表的存储引擎 mys ...
- sharepoint 开发
1. 客户端界面搜索 <div> 业务员:<).match(reg); ]);return null; } function search() { var k=document.ge ...
- 发送xml报文去第三方请求获取xml报文数据
import java.io.*; import java.net.HttpURLConnection; import java.net.MalformedURLException; import j ...
- 【转】Program Files (x86)文件夹是干什么的
转载地址:http://leonax.net/p/2373/what-program-files-x86-folder-for/ 今天在微博上看到有人问这个问题.在装好64位的Windows之后,能在 ...
- 使用KNN对MNIST数据集进行实验
由于KNN的计算量太大,还没有使用KD-tree进行优化,所以对于60000训练集,10000测试集的数据计算比较慢.这里只是想测试观察一下KNN的效果而已,不调参. K选择之前看过貌似最好不要超过2 ...
- ROADS
ROADS Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11977 Accepted: 4429 Description N ...
- Removing Columns 分类: 贪心 CF 2015-08-08 16:10 10人阅读 评论(0) 收藏
Removing Columns time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- JAVA基础知识之多线程——线程通信
传统的线程通信 Object提供了三个方法wait(), notify(), notifyAll()在线程之间进行通信,以此来解决线程间执行顺序等问题. wait():释放当前线程的同步监视控制器,并 ...