描述

http://www.lydsy.com/JudgeOnline/problem.php?id=2434

分析

  1 #include <bits/stdc++.h>
2 using namespace std;
3 inline int read(int &x){x=0;int k=1;char c;for(c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')k=-1;for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';return x*=k;}
4
5 const int maxn=1e5+5,type=26;
6 int n,qct;
7 int ans[maxn];
8 char s[maxn];
9 struct query{
10     int x[maxn],next[maxn],hd[maxn];
11     inline void add_query(int a,int b){
12         x[++qct]=a; next[qct]=hd[b]; hd[b]=qct;
13     }
14 }Q;
15 struct Aho_Corasick{
16     int sz,cnt,ect;
17     int q[maxn],hd[maxn],f[maxn],fa[maxn],val[maxn],pos[maxn],l[maxn],r[maxn],c[maxn<<1];
18     int ch[maxn][type];
19     struct edge{
20         int to,next;
21         edge(){}
22         edge(int to,int next):to(to),next(next){}
23     }g[maxn];
24     Aho_Corasick(){sz=cnt=0;memset(ch[0],0,sizeof ch[0]);}
25     inline int id(char c){return c-'a';}
26     inline int lowbit(int x){return x&-x;}
27     inline void add_edge(int u,int v){g[++ect]=edge(v,hd[u]);hd[u]=ect;}
28     inline void build_trie(){
29         int m=strlen(s+1);
30         int u=0;
31         for(int i=1;i<=m;i++){
32             int c=id(s[i]);
33             if(c=='P'-'a'){val[u]=++cnt,pos[cnt]=u;continue;}
34             if(c=='B'-'a'){u=fa[u];continue;}
35             if(!ch[u][c]){
36                 memset(ch[++sz],0,sizeof ch[sz]);
37                 ch[u][c]=sz;
38                 fa[sz]=u;
39             }
40             u=ch[u][c];
41         }
42     }
43     inline void get_fail(){
44         int L=1,R=0;
45         for(int c=0;c<type;c++){
46             int u=ch[0][c];
48         }
49         while(L<=R){
50             int u=q[L++];
51             for(int c=0;c<type;c++){
52                 int t=ch[u][c];
53                 if(!t){ch[u][c]=ch[f[u]][c];continue;}
54                 int v=f[u];
55                 f[t]=ch[v][c];
57                 q[++R]=t;
58             }
59         }
60     }
61     void dfs(int x,int &t){
62         l[x]=++t;
63         for(int i=hd[x];i;i=g[i].next) dfs(g[i].to,t);
64         r[x]=++t;
65     }
66     inline void add(int x,int d){
67         int R=sz<<1;
68         while(x<=R){
69             c[x]+=d;
70             x+=lowbit(x);
71         }
72     }
73     inline int sum(int x){
74         int ret=0;
75         while(x>0){
76             ret+=c[x];
77             x-=lowbit(x);
78         }
79         return ret;
80     }
81     inline void solve(){
82         int m=strlen(s+1);
83         int u=0;
84         for(int i=1;i<=m;i++){
85             int c=id(s[i]);
87             if(c=='P'-'a'){
88                 int y=val[u];
89                 for(int j=Q.hd[y];j;j=Q.next[j]){
90                     int x=Q.x[j];
91                     ans[j]=sum(r[pos[x]])-sum(l[pos[x]]-1);
92                 }
93                 continue;
94             }
95             u=ch[u][c];
97         }
98     }
99 }ac;
100 inline void init(){
101     scanf("%s",s+1);
102     ac.build_trie();
104     for(int i=1,a,b;i<=n;i++){
107     }
108 }
109 inline void solve(){
110     ac.get_fail();
111     int t=0;
112     ac.dfs(0,t);
113     ac.solve();
114     for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
115 }
116 int main(){
117     init();
118     solve();
119     return 0;
120 }
View Code

2434: [Noi2011]阿狸的打字机

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 2296  Solved: 1298
[Submit][Status][Discuss]

Description

阿狸喜欢收藏各种稀奇古怪的东西，最近他淘到一台老式的打字机。打字机上只有28个按键，分别印有26个小写英文字母和'B'、'P'两个字母。

l 输入小写字母，打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的最后)。

l 按一下印有'B'的按键，打字机凹槽中最后一个字母会消失。

l 按一下印有'P'的按键，打字机会在纸上打印出凹槽中现有的所有字母并换行，但凹槽中的字母不会消失。

a

aa

ab

Input

输入的第一行包含一个字符串，按阿狸的输入顺序给出所有阿狸输入的字符。

Output

输出m行，其中第i行包含一个整数，表示第i个询问的答案。

aPaPBbP

3

1 2

1 3

2 3

2

1

0

1<=N<=10^5

1<=M<=10^5

Source

posted @ 2016-07-06 18:04  晴歌。  阅读(103)  评论(0编辑  收藏  举报