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的中文稱為雜湊,這當然是音譯,直譯過來就是雜湊,或者也有叫預對映的。雜湊的作用就是通過某個特殊函式的對映,將任意...