計蒜客 旋轉數字 (kmp exkmp)

2021-08-25 17:04:45 字數 820 閱讀 9169

首先得去重,怎麼去重呢,剛開始想了好幾種方法,都不太理想,後再才想明白,找重複的不就是找找迴圈節嘛,因為如果存在迴圈節,那麼一定會造成重複,比如123123123,迴圈節是3,所以只需要迴圈數字三次即可,再多迴圈就會造成重複,那麼問題就來了,怎麼計算迴圈節呢?在學習kmp中,我們利用fail陣列的功能,很容易計算得到迴圈節。證明我這就不了,只說下方法,就是s.size()-fail[s.size()],當然這得要s.size()能整除前面那個式子才能是迴圈節。找到迴圈節了,又該怎麼辦呢,該怎麼比較呢,不妨先列下來看看:

假設該數為:21213,那麼下面就是他的懸轉數字。

正著看不好看,那麼就倒著看,咦~,這不就是擴充套件kmp嘛。前字尾進行比較啦。從前字尾初出現不相等的第乙個元素開始比較。

好啦,現在開始寫程式啦。

#include#include#includeusing namespace std;

const int maxn=1e5+10;

int next[maxn];

int extand[maxn]; //s的字尾與t的最長公共字首。

int fail[maxn];

void get_fail(char *pattern)

}void getnext(char* t)

printf("%d %d %d\n",xiao,same,da);

}return 0;

}

計蒜客 旋轉數字

計蒜客 旋轉數字 蒜頭君發現了乙個很好玩的事情,他對乙個數作旋轉操作,把該數的最後的數字移動到最前面。比如,數 123123 可以得到 312,231,123312,231,123,這樣就可以得到很多個數。現在,蒜頭君的問題是這些數中,有多少個不同的數小於原數,多少個等於原數,多少個大於原數。旋轉中...

計蒜客 單獨的數字

給定乙個陣列 a,除了乙個數出現一次之外,其餘數都出現三次。找出出現一次的數。如 找出 7。你的演算法只能是線性時間的複雜度,並且不能使用額外的空間哦 輸入格式 第一行輸入乙個數n 1 n 500 代表陣列的長度。接下來一行輸入 n 個 int 範圍內 2147483648 2147483647 的...

計蒜客 單獨的數字

給定乙個陣列 a a,除了乙個數出現一次之外,其餘數都出現三次。找出出現一次的數。如 找出 77。你的演算法只能是線性時間的複雜度,並且不能使用額外的空間哦 第一行輸入乙個數 n 1 leq n leq 500 n 1 n 500 代表陣列的長度。接下來一行輸入 n n 個 int 範圍內 2147...