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的更多相关文章
随机推荐
- Leetcode: Encode and Decode TinyURL
Note: This is a companion problem to the System Design problem: Design TinyURL. TinyURL is a URL sho ...
- Redis.之.环境搭建(集群)
Redis.之.环境搭建(集群) 现有环境: /u01/app/ |- redis # 单机版 |- redis-3.2.12 # redis源件 所需软件:redis-3.0.0.gem -- ...
- ELK+Filebeat 集中式日志解决方案详解
链接:https://www.ibm.com/developerworks/cn/opensource/os-cn-elk-filebeat/index.html?ca=drs- ELK Stack ...
- python模块与路径
# 切记不能与方法函数同名,否则会报错!!! # python的模块与包 分为三种: #1.标准库 #2.第三方模块 #3.自定义模块 #python 模块的引入原理: # 加入你创建了一个模块,在i ...
- MAVEN简介之——pom.xml
maven构建的生命周期 maven是围绕着构建生命周期这个核心概念为基础的.maven里有3个内嵌的构建生命周期,default,clean和site. default是处理你项目部署的:clean ...
- qemu创建vm和vcpu进入kvm的流程
kvm是一个内核模块,它实现了一个/dev/kvm的字符设备来与用户进行交互,通过调用一系列ioctl函数可以实现qemu和kvm之间的切换. 1.qemu发起KVM_CREATE_VM的ioctl创 ...
- Java延时器
package listener; import java.util.Timer; import java.util.TimerTask; public class Timeer { /** * sc ...
- 解决ping不通win7主机
之前在路由器上ping笔记本发现ping不通,但是笔记本ping路由器通,也没多想.今天想起来可能是win7的防火墙作怪,以前上课虚拟机好像也是ping不通宿主机,但是宿主机能ping通虚拟机. 简单 ...
- 用PIL库进行图像处理
一.如果系统里没有安装PIL库的,请先到命令提示符输入“pip install pillow”进行安装 二.之后就可以参考以下的代码 from PIL import Image from pylab ...
- 解决pycharm输入法不跟随的方法
先上图,这个pycharm编辑器默认条件下输入中文时输入法框的状态 这个是更改后的状态 修改方法就是将android studio中的jre目录 拷贝至 下,并更改名称为jre64 重新启动pycha ...