NOI2011 阿狸的打字機

2021-08-21 21:13:10 字數 1429 閱讀 4687

調了下午到晚上

從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自動機,準確地說和...