HDU_2222 大部分是别人的,有的地方稍有改动,代码有不完善的地方!
2014-02-14 11:49
483 查看
大部分是别人的,有的地方稍有改动
[cpp] view
plaincopy
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
#define N 500010
char str[1000010], keyword[51];
int head, tail;
struct node
{
node *fail;
node *next[26];
int count;
node() //初始化,(类似于构造函数)
{
fail = NULL;
count = 0;
for(int i = 0; i < 26; ++i)
next[i] = NULL;
}
}*q
;
node *root;
void trie(char *keyword) //建立Trie,每次只能建立一个keyword。
{
int temp, length;
node *p = root;
length = strlen(keyword);
for(int i = 0; i < length; ++i)
{
temp = keyword[i] - 'a';
if(p->next[temp] == NULL)
p->next[temp] = new node();
p = p->next[temp];
}
p->count++;
}
void build_ac() //初始化fail指针,BFS
{
q[tail++] = root;
while(head != tail)
{
node *p = q[head++]; //弹出队头
node *temp = NULL;
for(int i = 0; i < 26; ++i)
{
if(p->next[i] != NULL)
{
if(p == root) //第一个元素fail必指向根
p->next[i]->fail = root;
else
{
temp = p->fail; //失败指针
while(temp != NULL) //2种情况结束:匹配为空or找到匹配
{
if(temp->next[i] != NULL) //找到匹配
{
p->next[i]->fail = temp->next[i];
break;
}
temp = temp->fail;
}
if(temp == NULL) //为空则从头匹配
p->next[i]->fail = root;
}
q[tail++] = p->next[i]; //入队
}
}
}
}
int query() //扫描
{
int index, length, result;
node *p = root; //Tire入口
result = 0;
len = strlen(str);
for(int i = 0; i < length; ++i)
{
index = str[i] - 'a';
while(p->next[index] == NULL && p != root) //跳转失败指针
p = p->fail;
p = p->next[index];
if(p == NULL)
p = root;
node *temp = p; //p不动,temp计算后缀串
while(temp != root && temp->count != -1)
{
result += temp->count;
temp->count = -1;
temp = temp->fail;
}
}
return result;
}
int main()
{
int ncase, number;
scanf("%d", &ncase);
while(ncase--)
{
head= tail = 0;
root = new node();
scanf("%d", &number);
getchar();
for(int i = 0; i < number; ++i)
{
gets(keyword);
trie(keyword);
}
build_ac();
scanf("%s", str);
printf("%d\n", query());
}
return 0;
}
[cpp] view
plaincopy
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
#define N 500010
char str[1000010], keyword[51];
int head, tail;
struct node
{
node *fail;
node *next[26];
int count;
node() //初始化,(类似于构造函数)
{
fail = NULL;
count = 0;
for(int i = 0; i < 26; ++i)
next[i] = NULL;
}
}*q
;
node *root;
void trie(char *keyword) //建立Trie,每次只能建立一个keyword。
{
int temp, length;
node *p = root;
length = strlen(keyword);
for(int i = 0; i < length; ++i)
{
temp = keyword[i] - 'a';
if(p->next[temp] == NULL)
p->next[temp] = new node();
p = p->next[temp];
}
p->count++;
}
void build_ac() //初始化fail指针,BFS
{
q[tail++] = root;
while(head != tail)
{
node *p = q[head++]; //弹出队头
node *temp = NULL;
for(int i = 0; i < 26; ++i)
{
if(p->next[i] != NULL)
{
if(p == root) //第一个元素fail必指向根
p->next[i]->fail = root;
else
{
temp = p->fail; //失败指针
while(temp != NULL) //2种情况结束:匹配为空or找到匹配
{
if(temp->next[i] != NULL) //找到匹配
{
p->next[i]->fail = temp->next[i];
break;
}
temp = temp->fail;
}
if(temp == NULL) //为空则从头匹配
p->next[i]->fail = root;
}
q[tail++] = p->next[i]; //入队
}
}
}
}
int query() //扫描
{
int index, length, result;
node *p = root; //Tire入口
result = 0;
len = strlen(str);
for(int i = 0; i < length; ++i)
{
index = str[i] - 'a';
while(p->next[index] == NULL && p != root) //跳转失败指针
p = p->fail;
p = p->next[index];
if(p == NULL)
p = root;
node *temp = p; //p不动,temp计算后缀串
while(temp != root && temp->count != -1)
{
result += temp->count;
temp->count = -1;
temp = temp->fail;
}
}
return result;
}
int main()
{
int ncase, number;
scanf("%d", &ncase);
while(ncase--)
{
head= tail = 0;
root = new node();
scanf("%d", &number);
getchar();
for(int i = 0; i < number; ++i)
{
gets(keyword);
trie(keyword);
}
build_ac();
scanf("%s", str);
printf("%d\n", query());
}
return 0;
}
相关文章推荐
- 集合竞价 CCF java实现 (大部分代码是借鉴的别人的,)
- HDU 1072 Nightmare (BFS 状态的设定:参考了别人的代码)
- 钱币问题(自己没做出来,代码是看别人的改动了一下)
- 全排列 数据结构(机工出版) 递归算法 有改动 还有不完善的地方!
- 使用gprs发送短信息.借鉴于别人的代码.有点小改动 使用spcomm
- 【hdu 2222】Keywords Search 中文题意&题解&代码(C++)
- 软件开发者面试百问-----看别人代码的时候,你最关心什么地方?
- hdu 1001 初学java代码
- 修改了别人的代码、优化前与优化后的对比,唉,写个好代码真不容易啊
- hdu 2222 Keywords Search (ac自动机模板题)
- HDU--杭电1598--find the most comfortable road--并查集+暴力--反正是大众化的代码,只是我喜欢多写点东西导致我的注释比较多罢了
- 如何在git上clone别人的项目、提交代码以及更新最新代码
- 泛型 要注意的地方 下面的代码不能执行
- HDU 2222 - Keywords Search (AC自动机)
- 修改了别人的代码、优化前与优化后的对比,唉,写个好代码真不容易啊
- hdu 2222 AC自动机 first
- 如何阅读别人的代码
- hdu 2222 ac自动机入门题 可以做模板
- php 基础代码大全(不断完善中)
- HDU 2222 Keywords Search 【AC自动机(模板题)】