暴力是個好東西。。列舉一下所有子串,然後疊加一下判一下是否相等就ok。
當然這個演算法是o(n3)的。
所以想一想如何去優化。
首先可以用字首和的方法將上面那個演算法降一層n,然而o(n2)的複雜度依然承受不起。。。
然而很容易可以發現,這明明就是乙個嚴格上公升序列(貌似即使不是也沒關係)!
那麼就可以去搞單調佇列咯,用尺取法不斷挪動順便判一下!
嗯這就是o(n)了,已經達到理論下界了。(附上不太正確的**。。)
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #includeview code8 #include 9
using
namespace
std;
1011 dequeq;
12string
s,ss;
13long
long
h,sum,pos,tot;
14int
main()
30if(sum==h)break
;31 q.push_front(s[i]-'
a'+1
);32 sum+=s[i]-'
a'+1;33
}34 cout<
35#endif
3637
#ifdef n_3
38for(int i=0;i'
a'+1;39
for(int i=0;i)
45if(sum==h)49}
50}51#endif
5253
#ifdef n_2
54for(int i=0;i'
a'+1
;55 vectorv;
56for(int i=0;i'
a'+1
);57
for(int i=1;i1
];58
for(int i=0;i)64}
65}66#endif
67//
in fact,n^2 algorithm isn't slow in random tests...(maybe all the datas are easy to work on)
68 }
(話說為了卡一下暴力和騙分的程式是否應該變成最小滿足題意的字串的長度啊。。orz)
Hash 字串 字串雜湊
luo gu luogu luogup 3370 p3370 p337 0如題,給定n個字串 第i個字串長度為mi,字串內包含數字 大小寫字母 請求出n個字串中共有多少個不同的字串。第一行包含乙個整數n,為字串的個數。接下來n行每行包含乙個字串,為所提供的字串。輸出包含一行,包含乙個整數,為不同的字...
白兔的字串 字串hash
原題 一道典型的字串hash,至於hash,這裡講的非常好。一開始用map函式一直超時,後來改用unordered map就過了,至於這2個map的區別,這裡講的挺清楚的。之後去查了一下其它方法,發現還有一種方法是手寫map函式 強 指明 大佬 unordered map是跑了600ms,重寫跑了1...
字串 字串雜湊hash演算法
以洛谷p3370為引子引入吧 雜湊其實是所有字串操作中,筆者認為最簡單的操作了 except輸入輸出qwq 雜湊的過程,其實可以看作對乙個串的單向加密過程,並且需要保證所加的密不能高概率重複 就像不能讓隔壁老王輕易地用它家的鑰匙開啟你家門一樣qwq 通過這種方式來替代一些很費時間的操作。比如,最常見...