我的ac自动机第一题 hdu2222

//计算一篇文章中出现几个模板单词
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <functional>
#include <sstream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctime>
#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long ll;
#define INF 1e9
#define maxn 500010
#define maxm 100086+10
#define mod 1000000009
#define eps 1e-7
#define PI acos(-1.0)
#define rep(i,n) for(int i=0;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define scan(n) scanf("%d",&n)
#define scanll(n) scanf("%I64d",&n)
#define scan2(n,m) scanf("%d%d",&n,&m)
#define scanll2(n,m) scanf("%I64d%I64d",&n,&m)
#define scans(s) scanf("%s",s);
#define ini(a) memset(a,0,sizeof(a))
#define out(n) printf("%d\n",n)
#define outll(n) printf("%I64d\n",n)
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

struct AC
{	
	int last[maxn],f[maxn];
	int ch[maxn][26];
	int val[maxn];
	int sz;
	AC(){ init(); }
	void init()
	{
		sz = 1; memset(ch[0],0,sizeof(ch[0]));
	}
	int idx(char c) { return c - 'a'; }
	void insert(char *s,int v)
	{
		int u = 0, n = strlen(s);
		rep(i,n)
		{
			int c = idx(s[i]);
			if(!ch[u][c])
			{
				memset(ch[sz],0,sizeof(ch[sz]));
				val[sz] = 0;
				ch[u][c] = sz++;
			}
			u = ch[u][c];
		}
		val[u] ++;
	}

	void getFail()
	{
		queue<int> q;
		f[0] = 0;
		rep(c,26)
		{
			int u = ch[0][c];
			if(u) { f[u] = 0; q.push(u); last[u] = 0; }
		}

		while(!q.empty())
		{
			int r = q.front(); q.pop();
			rep(c,26)
			{
				int u = ch[r][c];
				if(u)
				{
					q.push(u);
					int v = f[r];
					while(v && !ch[v][c]) v = f[v];
					f[u] = ch[v][c];
					last[u] = val[f[u]] ? f[u] : last[f[u]];
				}
				else ch[r][c] = ch[f[r]][c];
			}
		}
	}

	int find(char *s)
	{
		int n = strlen(s);
		int ans = 0;
		int j = 0;
		rep(i,n)
		{
			int c = idx(s[i]);
			while(j && !ch[j][c]) j = f[j];
			j = ch[j][c];
			if(val[j]) ans += print(j);
			else ans += print(last[j]);
		}
		return ans;
	}

	int print(int j)
	{
		int ans = 0;
		if(j)
		{
			if(val[j]){ ans += val[j]; val[j] = 0; }
			ans += print(last[j]);
		}
		return ans;
	}
}ac;
char s[1000010];
char tmp[55];
int main()
{
#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
	// freopen("out.txt","w",stdout);
#endif 
	int T;
	cin>>T;
	int n;
	while(T--)
	{
		ac.init();
		cin>>n;
		rep1(i,n)
		{
			scans(tmp);
			ac.insert(tmp,i);
		}
		ac.getFail();
		scans(s);
		int ans = ac.find(s);
		out(ans);
	}
	return 0;
}


主要内容:本文详细介绍了一种QRBiLSTM(分位数回归双向长短期记忆网络)的时间序列区间预测方法。首先介绍了项目背景以及模型的优势,比如能够有效利用双向的信息,并对未来的趋势上限和下限做出估计。接着从数据生成出发讲述了具体的代码操作过程:数据预处理,搭建模型,进行训练,并最终可视化预测结果与计算分位数回归的边界线。提供的示例代码可以完全运行并且包含了数据生成环节,便于新手快速上手,深入学习。此外还指出了模型未来发展的方向,例如加入额外的输入特性和改善超参数配置等途径提高模型的表现。文中强调了时间序列的标准化和平稳检验,在样本划分阶段需要按时间序列顺序进行划分,并在训练阶段采取合适的手段预防过度拟合发生。 适合人群:对于希望学习和应用双向长短时记忆网络解决时序数据预测的初学者和具有一定基础的研究人员。尤其适用于有金融数据分析需求、需要做多一步或多步预测任务的从业者。 使用场景及目标:应用于金融市场波动预报、天气状况变化预测或是物流管理等多个领域内的决策支持。主要目的在于不仅能够提供精确的数值预计还能描绘出相应的区间概率图以增强结论置信程度。 补充说明:本教程通过一个由正弦信号加白噪构造而成的简单实例来指导大家理解和执行QRBiLSTM流程的所有关键步骤,这既方便于初学者跟踪学习,又有利于专业人士作为现有系统的补充参考工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值