【HDOJ】1277 全文检索

AC自动机与动态分配TLE问题解决
本文深入探讨了AC自动机在处理静态数组与动态分配时遇到的超时(TLE)问题,提供了优化策略并给出了具体实现代码。

AC自动机,静态数组,动态分配TLE。

  1 /* 1277 */
  2 #include <iostream>
  3 #include <cstdio>
  4 #include <cstring>
  5 #include <cstdlib>
  6 #include <queue>
  7 using namespace std;
  8 
  9 #define MAXL 60005
 10 #define TRIEN 10
 11 
 12 typedef struct Trie {
 13     int n;
 14     Trie *fail;
 15     Trie *next[TRIEN];
 16 } Trie;
 17 
 18 Trie tries[1000024];
 19 int nTrie;
 20 char s[MAXL];
 21 char str[65];
 22 int ans[10005], n;
 23 bool flag;
 24 Trie *root;
 25 
 26 Trie *newNode() {
 27     memset(tries[nTrie].next, 0, sizeof(tries[nTrie].next));
 28     tries[nTrie].n = 0;
 29     tries[nTrie].fail = NULL;
 30     return &tries[nTrie++];
 31 }
 32 
 33 void create(char str[], int v) {
 34     int i = 0, id;
 35     Trie *p = root, *q;
 36 
 37     while (str[i]) {
 38         id = str[i] - '0';
 39         ++i;
 40         if (p->next[id] == NULL) {
 41             q = newNode();
 42             p->next[id] = q;
 43         }
 44         p = p->next[id];
 45     }
 46     p->n = v;
 47 }
 48 
 49 void build_fail() {
 50     int i;
 51     Trie *p, *q;
 52     queue<Trie *> Q;
 53 
 54     for (i=0; i<TRIEN; ++i) {
 55         if (root->next[i]) {
 56             root->next[i]->fail = root;
 57             Q.push(root->next[i]);
 58         }
 59     }
 60 
 61     while (!Q.empty()) {
 62         p = Q.front();
 63         Q.pop();
 64         for (i=0; i<TRIEN; ++i) {
 65             if (p->next[i]) {
 66                 q = p->fail;
 67                 while (q) {
 68                     if (q->next[i]) {
 69                         p->next[i]->fail = q->next[i];
 70                         break;
 71                     }
 72                     q = q->fail;
 73                 }
 74                 if (q == NULL)
 75                     p->next[i]->fail = root;
 76                 Q.push(p->next[i]);
 77             }
 78         }
 79     }
 80 }
 81 
 82 void search(char s[]) {
 83     int i = 0, id;
 84     Trie *p = root, *q;
 85 
 86     while (s[i]) {
 87         id = s[i] - '0';
 88         ++i;
 89         while (p->next[id]==NULL && p!=root)
 90             p = p->fail;
 91         p = p->next[id];
 92         if (p == NULL)
 93             p = root;
 94         q = p;
 95         while (q != root) {
 96             if (q->n) {
 97                 flag = true;
 98                 ans[n++] = q->n;
 99                 q->n = 0;
100             }
101             q = q->fail;
102         }
103     }
104 }
105 
106 void del(Trie *t) {
107     if (t == NULL)
108         return ;
109     for (int i=0; i<TRIEN; ++i)
110         del(t->next[i]);
111     free(t);
112 }
113 
114 void init() {
115     n = 0;
116     flag = false;
117     nTrie = 0;
118     root = newNode();
119 }
120 
121 int main() {
122     int t, m;
123     int i, j, k;
124 
125     #ifndef ONLINE_JUDGE
126         freopen("data.in", "r", stdin);
127         //freopen("data.out", "w", stdout);
128     #endif
129 
130     while (scanf("%d %d", &t, &m) != EOF) {
131         for (i=0; i<t; ++i) {
132             scanf("%s%*c", str);
133             strcat(s, str);
134         }
135         getchar();
136         init();
137         for (i=1; i<=m; ++i) {
138             scanf("%*s %*s %*s %s", str);
139             create(str, i);
140         }
141         build_fail();
142         search(s);
143         if (flag) {
144             printf("Found key:");
145             for (i=0; i<n; ++i)
146                 printf(" [Key No. %d]", ans[i]);
147             printf("\n");
148         } else {
149             printf("No key can be found !\n");
150         }
151     }
152 
153     return 0;
154 }

 

转载于:https://www.cnblogs.com/bombe1013/p/4187632.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值