XSY3905 字串題(lyndon串,構造)

2022-05-20 16:40:33 字數 854 閱讀 8155

字串題

設所有長度不超過 \(n\) 的串的集合為 \(s\)。

考慮找到一種方法,能夠對乙個 lyndon 串 \(a\) ,直接求出 \(a\) 的下乙個 lyndon 串。方法如下:

先將 \(a\) 不斷複製, 取出前 \(n\) 位作為新的 \(a\) ,即 \(a\leftarrow aaa⋯\) 的前 \(n\) 位。

如果 \(a\) 的最後一位是 \('a'+m-1\),即字符集中最大的字元,則將其刪去,一直刪除直到最後一位不為 \('a'+m-1\)。

將 \(a\) 的最後乙個字元變為這個字元在字符集中的後繼。(其實 2、3 操作的實質是找到 1 操作後的 \(a\) 在字典序中的下乙個字串。

設構造出的串為 \(b\)。證明這種方法的正確性,只需要證明 \(b\) 是 lyndon 串,且 \(b\) 是 \(s\) 中字典序大於 \(a\) 的最小的 lyndon 串。

由於大部分滿足條件的 lyndon 串的長度均為 \(n\),這個演算法均攤複雜度為 \(o(1)\),可以 \(o(x)\) 通過此題。

**如下:

#include#define s 35

#define n 200010

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;}

struct query

q[n];

bool operator < (query a,query b)

}for(int i=1;i<=q;i++)

return 0;

}

NYOJ 題目915 字串(字串,水題)

時間限制 1000 ms 記憶體限制 65535 kb 難度 1 描述shiva得到了兩個只有加號和減號的字串,字串長度相同。shiva一次可以把乙個加號和它相鄰的減號交換。他想知道最少需要多少次操作才能把第乙個字串變換成第二個字串。你現在要去幫助他完成那個這個問題。輸入多組測試資料 每組資料有兩行...

演算法題(一) 字串

public static string submax string strarr else if max k system.out.println max return arrays.copyofrange strarr,start,end 1 給定兩個字串str1,str2。如果兩者字元種類和相...

leetcode題 394 字串解碼 中等)

一 題目描述 394.字串解碼 中等 給定乙個經過編碼的字串,返回它解碼後的字串。編碼規則為 k encoded string 表示其中方括號內部的 encoded string 正好重複 k 次。注意 k 保證為正整數。你可以認為輸入字串總是有效的 輸入字串中沒有額外的空格,且輸入的方括號總是符合...