zoj3223
其实这题不超时完全是因为串长度太小,如果串够长,一次匹配后都要往上跳,复杂度是n^2的。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#include <bitset>
#define mkp make_pair
using namespace std;
const double EPS=1e-;
typedef long long lon;
const lon SZ=,SSZ=,APB=,one=,INF=0x7FFFFFFF,mod=;
int n,cnt,dp[SZ][],pre[SZ],len[SZ];
int nex[SZ][APB],fail[SZ];
struct nd{
int pos,type;
nd(int a=,int b=):pos(a),type(b){}
};
nd qry[SZ];
char ch[SZ],str[]; void add(int x)
{
int cur=;
for(int i=;str[i];++i)
{
int c=str[i]-'a';
if(!nex[cur][c])nex[cur][c]=++cnt;
cur=nex[cur][c];
}
qry[x].pos=cur;
len[cur]=strlen(str+);
} void build()
{
queue<int> q;
q.push();
for(;q.size();)
{
int fr=q.front();
q.pop();
for(int i=;i<APB;++i)
{
int t=nex[fr][i];
if(t)
{
if(!fr)
{
fail[t]=fr;
}
else
{
int u=fail[fr];
for(;u&&!nex[u][i];u=fail[u]);
u=nex[u][i];
fail[t]=u;
}
q.push(t);
}
}
}
} void init()
{
//cin>>n;
scanf("%d",&n);
for(int i=;i<=n;++i)
{
int type;
//cin>>type>>str+1;
scanf("%d",&type);
scanf(" %s",str+);
add(i);
qry[i].type=type;
}
build();
} int getnex(int x,int c)
{
for(;x&&!nex[x][c];x=fail[x]);
x=nex[x][c];
return x;
} void update(int x,int pos)
{
for(;x;x=fail[x])
{
++dp[x][];
if(pos-pre[x]>=len[x])
{
++dp[x][];
pre[x]=pos;
}
}
} void work()
{
int cur=;
for(int i=;ch[i];++i)
{
int c=ch[i]-'a';
cur=getnex(cur,c);
update(cur,i);
}
for(int i=;i<=n;++i)
{
printf("%d\n",dp[qry[i].pos][qry[i].type]);
//cout<<<<endl;
}
} void release()
{
for(int i=;i<=cnt;++i)
{
memset(nex[i],,sizeof(nex[i]));
memset(dp[i],,sizeof(dp[i]));
pre[i]=;
}
cnt=0LL;
} int main()
{
//std::ios::sync_with_stdio(0);
//freopen("d:\\1.txt","r",stdin);
int casenum;
//cin>>casenum;
//cout<<casenum<<endl;
//for(int time=1;time<=casenum;++time)
for(int time=;scanf(" %s",ch+)!=EOF;++time)
{
//cout<<""<<<<endl;
//if(time!=1)
printf("Case %d\n",time);
init();
work();
release();printf("\n");
}
return ;
}
zoj3223的更多相关文章
随机推荐
- JDK8 BigDecimal API-创建BigDecimal源码浅析二
第二篇,慢慢来 根据指数调整有效小数位数 // 上一篇由字符串创建BigDecimal代码中,有部分代码没有给出,这次补上 // 这个是当解析字符数组时存在有效指数时调整有小小数位数方法 privat ...
- flask框架中,利用数据库增删查改
# 配置数据库app.config['SQLALCHEMY_DATABASE_URI'] = "mysql://root:mysql@127.0.0.1:3306/booktest" ...
- IDEA 破解_补丁永久_2018.3
主要是Eclipse我已经玩坏了三次了,切换jdk8到jdk10,再切换到jdk8,大量文件乱码,怎么改都没用,有的时候Eclipse久了不用,项目放在里面发霉了,坏掉了,MMP,换到I ...
- CentOS 7下 部署Redis-cluster集群
redis集群是一个无中心的分布式redis存储架构,可以在多个节点之间进行数据共享,解决了redis高可用.可扩展等问题,redis集群提供了以下两个好处:1)将数据自动切分(split)到多个节点 ...
- python精进之路 -- open函数
下面是python中builtins文件里对open函数的定义,我将英文按照我的理解翻译成中文,方便以后查看. def open(file, mode='r', buffering=None, enc ...
- Javascript基础语法(三)
数组 1.什么是数组 有许多变量,它们的名称和数据类型都是一致的. 2. 数组声明 var arr = [元素,元素,元素...]; var arr = new Array(元素,元素,元素...); ...
- [dart学习]第一篇:windows下安装配置dart编译环境,写出helloworld
前言 博主非科班出身,平时多用C语言,最近想了解学习一门第二语言,看上了可用于移动开发的目前还小众一点dart,准备用一段比较长的时间来慢慢学习.理解. 关于dart语言不再详细介绍了,大家可以访问 ...
- [转]SQL中 OVER(PARTITION BY) 取上一条,下一条等
OVER(PARTITION BY)函数介绍 开窗函数 Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返 ...
- 关于Java多线程的一些常考知识点
前言 Java多线程也是面试中经常会提起到的一个点.面试官会问:实现多线程的两种方式以及区别,死锁发生的4个条件以及如何避免发生死锁,死锁和活锁的区别,常见的线程池以及区别,怎么理解有界队列与无界队列 ...
- JDK源码分析(12)之 ConcurrentHashMap 详解
本文将主要讲述 JDK1.8 版本 的 ConcurrentHashMap,其内部结构和很多的哈希优化算法,都是和 JDK1.8 版本的 HashMap是一样的,所以在阅读本文之前,一定要先了解 Ha ...