重複字串

2021-07-24 16:05:45 字數 2241 閱讀 2739

題目描述

給定兩個字串a和b,我們可以定義一些操作:a*b為將字串a和字串b連線起來,比如a= 「aoe」,b= 「jkw」,那麼a*b= 「aoejkw」。進一步,我們可以有指數操作,a^0= 「」, a^1=a, a^2=a*a, a^n=a*(a^(n-1))=a*a*…*a (n個a)

現在給你乙個字串,你可以將它看成是a^n的形式,比如字串」abababab」,可以認為是」abab」^2, 也可以是」abababab」^1,還可以是」ab」^4。

現在問題是,給定的字串,我們想讓它變成a^n中的n達到最大,那麼這個n最大是多少?例如:」abababab」最大的n是4。

輸入 第一行,乙個整數m,表示有m個字串。

接下來m行每行輸入乙個只含小寫字母的字串。

輸出 輸出m行,對於每行輸出相應字串的最大n。

樣例輸入

3 abcde

aaaaaa

abababab

樣例輸出

1 6

4 提示

30%的資料:字串的長度≤1000;

100%的資料:字串的長度≤1000000, m≤10,字串內只含小寫字母。

30分做法:列舉

長度範圍只有1000時,我們可以列舉k, 取字串第1個到第k個字元作為子串t,然後去驗證剩下的字串是否都是t重複得來

時間複雜度o(n^2)

100分做法:kmp,next陣列

假設字串為s,長度為n,子串t重複k次後得到串s,那麼t的長度一定為l = n/k(要整除),則t = s[1…l],將s拆分成k份,每份長度為l,則有

s[1…l] = s[l+1…2l] = s[2l+1…3l] = … = s[(k-1)l+1…kl]

由於要保證k最大,勢必l要取最小,所以根據next函式的定義,有next[kl] = (k-1)l;

即next[n] = n - l,所以l = n - next[n];

但是得出的長度l還要保證能被n整除,所以如果不能整除說明l = n,即k = 1;而如果能整除,那麼k = n / (n - next[n]);

因而我們只要對字串s做一趟kmp,對其求next陣列,剩下的就是上述結論

時間複雜度o(n)

var

q,t,len,i,ans,k:longint;

f:boolean;

next:array[0.

.2000011] of longint;

s:ansistring;

function find(i,k:longint):longint;

begin

if k=0

then

exit(0);

if s[i]=s[next[k]+1] then

exit(next[k]+1)

else

exit(find(i,next[k]));

end;

begin

readln(t);

for q:=1

to t do

begin

readln(s);

len:=length(s);

fillchar(next,sizeof(next),0);

for i:=2

to len do

begin

k:=i-1;

while (s[i]<>s[next[k]+1])and(k<>0) do

begin

k:=next[k];

end;

if k=0

then

next[i]:=0

else

next[i]:=next[k]+1;

end;

ans:=next[len];

if ans=0

then

begin writeln('1'); continue; end;

i:=ans+1;

f:=true;

while i<=len do

begin

if s[(i-1) mod ans+1]<>s[i] then

begin f:=false; break; end;

i:=i+1;

end;

if f then writeln(len div (len-ans))

else writeln('1');

end;

end.

刪除重複字串

oj.h ifndef oj head define oj head int getresult const char input,char output endif oj.cpp include oj.h description 給定乙個字串,將字串中所有和前面重複多餘的字元刪除,其餘字元保留,輸...

重複字串 powerstr

現在給你乙個字串,你可以將它看成是a n的形式,比如字串 abababab 可以認為是 abab 2,也可以是 abababab 1,還可以是 ab 4。求出n最大為多少。直接可以發現是為因數才能分解,所以就找出因數,從大到小列舉一波就好了,遇到可以的就直接退出。const maxn 10000 v...

去除重複字串

建立新集合將重複元素去掉 1,明確返回值型別,返回arraylist 2,明確引數列表arraylist 分析 1,建立新集合 2,根據傳入的集合 老集合 獲取迭代器 3,遍歷老集合 4,通過新集合判斷是否包含老集合中的元素,如果包含就不新增,如果不包含就新增 public static array...