XIOI 字串的週期

2021-07-06 09:31:59 字數 1331 閱讀 6006

題目描述

給出乙個長度為n的由asc碼從97到126之間的字元組成的字串s,我們想知道s的字首中哪些是週期性的(週期至少為2)。也就是說對任一i(2≤i≤n),s的前i個字元是否可以表示為ak,ak 表示字串a重複k次形成的字串,如aab2=aabaab,如果s的前i個字元可以表示成ak,求出最大的k。

輸入

輸入檔案第一行包含乙個整數n,2<=n<=1,000,000,表示字串s的長度,輸入檔案的第二行給出字串s。
輸出

輸出檔案包含若干行,每行輸出兩個嚴格用乙個空格隔開的整數i和k,表示字串s的前i個字元的最大週期為k,所有輸出行按i從小到大輸出。

樣例

樣例輸入:

aabaabaabaab

樣例輸出

2 26 2

9 312 4

kmp裸題。。。(然而我不會打kmp ) 所以我只打了個暴力拿到42分滾粗。。開個陣列記錄暴力匹配據說能水道85.。原因是對於每個字串字串一定是能匹配的因為整個串都滿足條件存在若干字串。所以我們只需要記錄最小字串,匹配到後直接中間輸出匹配長度除以最小字串長度就好了233

#include

#include

#include

#include

#define n 2005

using

namespace

std;

int n,m,x,y,tot,head,tail;

int next[n*n*2],point[n],v[n*n*2],ans[n];

bool b[n],pd;

inline

int in()

void add(int x,int y,int i)

void dfs(int x)

for (int i=point[x];i;i=next[i])

if (!b[v[i]])

}int main()

for (int i=2;ifalse;

memset(b,0,sizeof(b));

b[i]=true;

dfs(1);

if (!pd) ans[++tot]=i;

}printf("%d\n",tot);

for (int i=1;iprintf("%d ",ans[i]);

printf("%d\n",ans[tot]);

}

字串週期

如果乙個字串可以由某個長度為k的字串重複多次得到,則稱該串以k為週期。例如abcabcabcabc以3位週期 同時它也以6和12為週期 輸入乙個長度不超過80的字串,輸出其最小週期。1 字串長度可以整除週期 2 如果乙個字串以t為週期,那麼在字串範圍內,存在 s i s i t 可以使用窮舉的方式來...

字串週期的問題

如果s1s2s3s4.sn s3s4s5.sns1s2 那麼說明s1 s2,s2 s3,s3 s4,s4 s5.說明這個字串是乙個週期串。更一般的情況是 s i s i 1 s n s 1 s i 1 s j s j 1 s n s 1 s j 1 i j 那麼說明以i開始的字串是乙個週期串。題目 ...

藍橋杯 週期字串 字串處理

演算法提高 週期字串 時間限制 1.0s 記憶體限制 256.0mb 問題描述 右右喜歡聽故事,但是右右的媽媽總是講一些 從前有座山,山里有座廟,廟裡有個老和尚給小和尚講故事,講的什麼呢?從前有座山 這樣迴圈的故事來搪塞右右。我們定義,如果乙個字串是以乙個或者乙個以上的長度為k的重複字串所連線成的,...