調了下午到晚上
從0->40->70->100
心力交瘁
40分做法:
直接在fail樹上暴力跳,修改節點值,樹狀陣列查詢時間複雜度n^2log
70分做法:
接近正解,離線詢問,在對應的位置打標記,dfs的時候可以遍歷到這個點的時候,對這個點所有的詢問都可以同時處理出來
100分做法:
讀入的時侯可以優化一下,對於原來建過的trie不用再建,優化一下非常快
**
#include#includeusing namespace std;
const int maxn=1e5+5;
char s1[maxn];
char ch[maxn];
struct edge e[maxn<<1];
int ans[maxn];
struct qu q[maxn];
vectorex[maxn<<1];
bool vis[maxn];
int h[maxn<<1];
int last[maxn];
int val[maxn];
int dep[maxn];
int root=0;
struct node ac[maxn<<1];
int in[maxn],out[maxn];
int fa[maxn];
int lastpos,tot,cnt,m,idx,l,r,da;
void add(int u,int v)
char s[maxn];
void insert(int num)
fa[ac[da].nxt[id]]=da;
da=ac[da].nxt[id];
} last[num]=da;
}void getroot()
}int que[maxn<<1];
void getfail()
} while (head=1;i-=lowbit(i))
return rt;
}void dfs(int u)
out[u]=idx;
}void dfs1(int u) else if (s1[i]=='p') else
} for(int o=0;o<=cnt;o++)
for(int i=0;i<26;i++)
ac[o].jz[i]=ac[o].nxt[i];
getfail();
dfs(root);
scanf("%d",&m);
for (int i=1;i<=m;i++)
memset(vis,0,sizeof(vis));
dfs1(root);
for (int i=1;i<=m;i++)
return 0;
}
NOI2011阿狸的打字機
阿狸喜歡收藏各種稀奇古怪的東西,最近他淘到一台老式的打字機。打字機上只有28個按鍵,分別印有26個小寫英文本母和 b p 兩個字母。經阿狸研究發現,這個打字機是這樣工作的 l 輸入小寫字母,打字機的乙個凹槽中會加入這個字母 這個字母加在凹槽的最後 l 按一下印有 b 的按鍵,打字機凹槽中最後乙個字母...
NOI2011 阿狸的打字機
阿狸喜歡收藏各種稀奇古怪的東西,最近他淘到一台老式的打字機。打字機上只有28個按鍵,分別印有 26個小寫英文本母和 b p 兩個字母。經阿狸研究發現,這個打字機是這樣工作的 輸入小寫字母,打字機的乙個凹槽中會加入這個字母 按 p 前凹槽中至少有乙個字母 按一下印有 b 的按鍵,打字機凹槽中最後乙個字...
NOI2011阿狸的打字機
剛學完字串演算法做一做題,這道題的質量的確很高,做完以後感覺對ac自動機有長進 一下的神仙思路來自yyb dalao 蒟蒻開始只想到了40分暴力,全程靠題解 step1 首先直接處理出所有的串再裸kmp好寫,但是覺得得分應該不高,也沒有人說能拿多少分 這個題正解的第一步是要想到ac自動機,準確地說和...