夏令營8 6 8 8字串

2021-07-16 08:37:08 字數 2738 閱讀 6590

t1 poj3461

#include

#include

#include

#include

using namespace std;

int next[10001];

int main()

k=0;

for(int i=0;i0&&s[i]!=t[k])

k=next[k-1];

if(s[i]==t[k])

k++;

if(k==tl)

}cout

#include

#include

#include

using namespace std;

int ans[220005];

int main()

printf("%d\n",max1);  

}return 0;

}

t3, poj2185 網上最常見的就是每一行的最短迴圈節的最小公倍數*每一列的最短迴圈節的最小公倍數。但是,實際上是不行的。

aaaabaaa

#include

#include

#include

using namespace std;

char s[1001][80];

int f[1001];

int next[1001];

int main()

}if(pd==false)

break;

}if(pd==true)

f[j+1]++;}}

int width;

for(int i=1;i<=m;i++)

if(f[i]==n)

next[0]=0; int k=0;

for(int i=1;i0&&strcmp(s[i],s[k])) k=next[k-1];

if(!strcmp(s[i],s[k])) k++;

next[i]=k;

}printf("%d\n",(n-next[n-1])*width);

return 0;

}

t4.hdu4333 這道題目最好的方法是用拓展kmp,經過觀察,其實就是求每一位的字尾與自身的最長公共字首,這個顯然可以用擴充套件kmp處理,但是開始的時候我超時了,後來在網上看到別人把這個串後面再接上本身,以它為主串,然後以自身為模板串進行擴充套件kmp,這樣處理把時間複雜度降到了線性的,最後要注意的乙個問題就是如何避免重複了,我們可以用普通的kmp求出此串的最小迴圈節,如果構成完整的迴圈,那麼我們要算的就是迴圈節長度的情況了。

但是,我用了字尾陣列的倍增法。按理來說應該也可以,但不知為什麼re了

#include

#include

#include

#include

using namespace std;

const int n = int(400005);

int cmp(int *r,int a,int b,int l,int g)

int y[n],sa[n];

bool bo[400005];

int wa[n],wb[n],ws1[n],wv[n];

void da(char *r,int sa,int n,int m,int t1)

for(i=0;i=0;i--)

sa[--ws1[wv[i]]]=y[i];

t=x;

x=y;

y=t;

x[sa[0]]=1;

for(p=1,i=1;ibz&&!bo[x[i]])

if(x[i]t5,hdu3613,manacher/ekmp

manacher,求出簡單的回文串的變形,先將到每個位置的價值預處理出來然後將字串跑一邊馬拉車,我列舉切每個位置的價值和,如現在列舉的是切第三個的位置,則判斷一下前三個位置能否形成回文串,那麼我們只用判斷第二個位置的len1如果等於三則說明是回文串就醒了。

ekmp,將s1翻轉得到s2,如果s1[i]---s1[len-1]=s2[0]---s[(len-1)-i],那麼,這一段就是回文串,反過來也是一樣。這可以用ekmp實現。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 99999999

using namespace std;

const int max=500000+10;

char s1[max],s2[max];

int next1[max],extend1[max],extend2[max];

int sum[max],val[27],j;

void get_next(char *a,int len)}}

void ekmp(char *a,char *b,int *extend,int len)

}int main()

cout

2020南大軟體夏令營機試模擬題3 字串的展開

如果在輸入的字串中,含有 類似於 d h 或者 4 8 的字串,我們就把它當作一種簡寫,輸出時,用連續遞增的字母獲數字串替代其中的減號,即,將上面兩個子串分別輸出為 defgh 和 45678 在本題中,我們通過增加一些引數的設定,使字串的展開更為靈活。具體約定如下 1 遇到下面的情況需要做字串的展...

字串1 字串的旋轉

題目描述 給定乙個字串,要求將字串前面的若干個字元移到字串的尾部。例如 將字串 abcdef 的前三個字元 a b c 移到字串的尾部,那麼原字串將變成 defabc 首先想到的是將需要移動的字元乙個乙個移到字串的尾部。實現如下 public class transfet s n 1 t publi...

字串(一) 字串Hash

今天開一手最不 tao 擅 yan 長的字串演算法 字串hash演算法。似乎提到字串的話,kmp應該是更為常見的一種,但是hash有它的優點,被犇們稱為 優雅的暴力 何謂hash?hash的中文稱為雜湊,這當然是音譯,直譯過來就是雜湊,或者也有叫預對映的。雜湊的作用就是通過某個特殊函式的對映,將任意...