小明對英語一竅不通,令老師十分頭疼。於是期末考試前夕,小明被逼著開始背單詞……
老師給了小明一篇長度為n的英語文章,然後讓小明背m個單詞。為了確保小明不會在背單詞時睡著,老師會向他提q個問題,每次老師隨機選擇乙個區間l..r,小明要回答在這段文字中他背過的單詞總共出現過多少次。
輸入格式:
第一行兩個整數m、q如前所述。第二行為英語文章。接下來m行每行乙個需要背的單詞。接下來q行每行乙個詢問,包含兩個整數l、r(含端點),即給定的文字區間。
輸出格式:
q行,對每個詢問輸出一行表示答案。
輸入樣例#1:
3 3輸出樣例#1:abcabcbc
abcbc
a1 3
6 71 8
3資料範圍:07
對於30%的資料,1<=n<=10^3,1<=q<=10^3
對於60%的資料,1<=n<=10^5,1<=q<=10^5
對於100%的資料,1<=n<=10^6,1<=m<=10,1<=q<=10^6,1<=每個單詞的長度<=n,1<=l<=r<=n
正解 m次kmp 統計字首和。
不知為什麼的錯解:ac自動機,卡了90分鐘 。不明白為什麼,感覺挺對,也可能是我寫得醜。
每次詢問取出x~y的子串 跑ac自動機,路過大神幫忙看一下。。(明知不會有大神路過,卻依舊恬不知恥)..
屠龍寶刀點選就送
#include #include求說為什麼錯的ac自動機const
int n = 1e6+5
;int que[n],num[n],cnt[n],trie[n][26],fail[n],n,q,siz=1
;char
text[n],a[n];
inline
void ins(int
k) cnt[p]++;
num[p]=k;
}inline
void read(int &x)
void
build()
if(!tmp) fail[trie[now][i]]=1
; }
que[++r]=trie[now][i]; }}
}}int query(int l,int
r)
return
ans;
}int
main()
build();
for(int x,y;q--;)
return0;
}
#include #include#include
const
int n = 1e6+5
;inline
void read(int &x)
int len,n,q,los[n],next[n],sum[n][15
];char
text[n],word[n];
void kmp(int k,int
l) i=0,j=0
;
for(;il;)
}int
main()
for(int i=1;i<=len;++i)
for(int j=1;j<=n;++j)
sum[i][j]+=sum[i-1
][j];
for(int x,y,ans;q--;)
printf(
"%d\n
",ans);
}return0;
}
洛谷P3294 SCOI2016 背單詞 題解
題目傳送 閱讀理解題題意解釋可以看這位大佬的部落格。發現求字尾與倒序求字首是等價的,而找字首自然就想到了trie樹。將所有字串翻轉後再建入trie樹中,再對每乙個字串翻轉後從trie樹中找字首,就能找到乙個字串的所有字尾了。由第三種情況知我們要想最小化總代價,則最小化乙個字串與最靠近它的字尾間的距離...
洛谷 P1666 字首單詞
首先空集合也是答案,所以樣例是對的 那麼我們思考 假如兩個串ab a b 如果這個時候a不是b的字首 那麼所有字典序小於a的並且不是a的字首的字串均不是b的字首 所以我們先對串排序,然後直接dp f i j 表示1 j號串裡取i個 j號必須取 的所喲方案數 f 0 0 0 include defin...
洛谷p1019 單詞接龍
單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如 beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分不能...