COJ 0999 WZJ的数据结构(负一)
| WZJ的数据结构(负一) |
| 难度级别:D; 运行时间限制:1000ms; 运行空间限制:262144KB; 代码长度限制:2000000B |
|
试题描述
|
|
输入N个模板串Pi和文本串T,输出每个模板串Pi在T中出现了多少次。
|
|
输入
|
|
第一行为一个正整数N。
接下来N行为Pi。 最后一行为T |
|
输出
|
|
输出N行,第i行为模板串Pi在T中出现的次数。
|
|
输入示例
|
|
5
a ab ba aba a ababababa |
|
输出示例
|
|
5
4 4 4 5 |
|
其他说明
|
|
1<=sigma(|Pi|)<=1000000
1<=|T|<=1000000 保证Pi与T只由小写字母'a'或'b'组成 |
题解:感人至深!
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
using namespace std;
const int maxn=+,inf=-1u>>,sig=,maxnode=maxn;
struct node{node*tx[sig],*fail;int x;node(){x=;}}ac[maxnode],*nodecnt=ac,*root=nodecnt++;
struct ted{int x,y;ted*nxt;}adj[maxn],*ms=adj,*fch[maxn],adj2[maxn],*ms2=adj2,*fch2[maxn];
void add(int x,int v){*ms=(ted){x,v,fch[x]};fch[x]=ms++;return;}
void add2(int x,int y){*ms2=(ted){x,y,fch2[x]};fch2[x]=ms2++;return;}
int num[maxn],ans[maxn];
void insert(char*s,int v){
node*x=root;
for(int i=;s[i];i++){
int c=s[i]-'a';
if(!x->tx[c]) x->tx[c]=nodecnt++;
x=x->tx[c];
} add(x-ac,v);return;
}
void getfail(){
queue<node*>Q;for(int c=;c<sig;c++)if(root->tx[c])Q.push(root->tx[c]),root->tx[c]->fail=root;
while(!Q.empty()){
node*x=Q.front();Q.pop();
for(int c=;c<sig;c++)if(x->tx[c]){
node*p=x->fail;while(p&&!p->tx[c])p=p->fail;if(!p)p=root;
x->tx[c]->fail=p->tx[c]?p->tx[c]:root;Q.push(x->tx[c]);
}
} return;
}
void dfs(node*x){
for(ted*e=fch2[x-ac];e;e=e->nxt) dfs(e->y+ac),num[x-ac]+=num[e->y];
}
int query(char*s){
for(int i=;i<=nodecnt-ac-;i++) add2(ac[i].fail-ac,i);
node*x=root;
for(int i=;s[i];i++){
int c=s[i]-'a';
while(x&&!x->tx[c]) x=x->fail;if(!x)x=root;
x=x->tx[c]?x->tx[c]:root;num[x-ac]++;
} dfs(root);
for(int i=nodecnt-ac-;i;i--)
for(ted*e=fch[i];e;e=e->nxt)
ans[e->y]=num[i];
}
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') sig=-;ch=getchar();}
while(isdigit(ch)) x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<) putchar('-'),x=-x;
int len=,buf[];while(x) buf[len++]=x%,x/=;
for(int i=len-;i>=;i--) putchar(buf[i]+'');return;
}
char s[maxn];
int n;
void init(){
n=read();
for(int i=;i<=n;i++) scanf("%s",s),insert(s,i);
getfail();
scanf("%s",s);query(s);
for(int i=;i<=n;i++) write(ans[i]),ENT;
return;
}
void work(){
return;
}
void print(){
return;
}
int main(){
init();work();print();return ;
}
COJ 0999 WZJ的数据结构(负一)的更多相关文章
- COJ 0967 WZJ的数据结构(负三十三)
WZJ的数据结构(负三十三) 难度级别:E: 运行时间限制:7000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大 ...
- COJ 0970 WZJ的数据结构(负三十)树分治
WZJ的数据结构(负三十) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,点和边上均有权值.请你设计 ...
- COJ 0990 WZJ的数据结构(负十)
WZJ的数据结构(负十) 难度级别:D: 运行时间限制:5000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 给你一个N个节点的有根树,从1到N编号,根节点为1并给 ...
- COJ 0995 WZJ的数据结构(负五)区间操作
WZJ的数据结构(负五) 难度级别:C: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大小为 ...
- COJ 0979 WZJ的数据结构(负二十一)
WZJ的数据结构(负二十一) 难度级别:C: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你实现一个数据结构,完成这样的功能: 给你一个 ...
- COJ 0981 WZJ的数据结构(负十九)树综合
WZJ的数据结构(负十九) 难度级别:E: 运行时间限制:3500ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 WZJ的数据结构中有很多都是关于树的.这让很多练习 ...
- COJ 1008 WZJ的数据结构(八) 树上操作
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=986 WZJ的数据结构(八) 难度级别:E: 运行时间限制:3000ms: ...
- COJ 1007 WZJ的数据结构(七) 树上操作
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=983 WZJ的数据结构(七) 难度级别:C: 运行时间限制:1000ms: ...
- COJ 1003 WZJ的数据结构(三)ST表
WZJ的数据结构(三) 难度级别:B: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大小为N的 ...
随机推荐
- ASP.NET页面同时发起多个ajax请求,出现阻塞情况
解决办法:假如页面对Session只读不写,可以在页面的开头加上EnableSessionState="ReadOnly".
- vmware workstation11虚拟机破解版(附安装教程) 32/64位
http://kuai.xunlei.com/d/ru4IAALVJQBesH9U93e?p=20395 vmware workstation 11注册机是一款可以免费生成vmware11.0版本序列 ...
- 加入gitignore文件没有起作用怎么办
步骤一: 假设有未提交的文件先提交到Git. 步骤二: 在Git根文件夹下运行以下的Git命令: git rm -r --cached . git add . git commit -m " ...
- huffman编码——原理与实现
哈夫曼算法原理 Wikipedia上面说的非常清楚了,这里我就不再赘述,直接贴过来了. 1952年, David A. Huffman提出了一个不同的算法,这个算法能够为不论什么的可能性提供出一个理想 ...
- #ifndef #define #endif 的用法
1.文件中的#ifndef 头件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都include了同一个头文件.而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来 ...
- 国内使用google地图的初级使用
<!DOCTYPE html><html><head><title>Simple Map</title><meta name=&quo ...
- UITableView实现分组, 并且点击每个分组后展开
效果图: 简单说下实现思路: 数据传过来之后, 先创建好对应个数的分组头部View, 也就是要在 - (UIView *)tableView:(UITableView *)tableView view ...
- C#基础学习第三天(.net菜鸟的成长之路-零基础到精通)
1.复合赋值运算符 += -= *= /= %= 2.关系运算符 > < >= <= == != 由关系运算符连接的表达式我们称之为关系表达式. 每一个表达式都可以求解出 ...
- String分割类
StringTokenizer类 用的时候要 import java.util.StringTokenizer; StringTokenizer b=new StringTokenizer( Stri ...
- Menu学习
本文由博主(YinaPan)原创,转载请注明出处:http://www.cnblogs.com/YinaPan/p/Unity_Menu.html using UnityEditor; using U ...