演算法高階 基本資料結構 B

2021-09-24 18:15:43 字數 4858 閱讀 3211

給定n個長度為6的序列,求有無相同的序列,相同序列的定義是順時針或逆時針的最小表示相同

每次將讀進來的序列雜湊一下,做個雜湊表,判斷有無相同序列

#includeusing namespace std; 

const unsigned long long inf=160001;

unsigned long long h[inf],a[21],n;

int fd(unsigned long long k)

if(b)

else

else

}unsigned long long ans1=min(ii,jj);ii=12,jj=11;

while(ii>=7&&jj>=7)

else

}unsigned long long ans2=max(ii,jj);

if(hsh(ans1,ans2))

}printf("no two snowflakes are alike.");

}

很久很久以前,森林裡住著一群兔子。有一天,兔子們想要研究自己的dna序列。我們首先選取乙個好長好長的dna序列(小兔子是外星生物,dna序列可能包含26個小寫英文本母),然後我們每次選擇兩個區間,詢問如果用兩個區間裡的dna序列分別生產出來兩隻兔子,這兩個兔子是否一模一樣。注意兩個兔子一模一樣只可能是他們的dna序列一模一樣。

線性的將所有字首的雜湊值求出,之後只要按照數字相減就可以求得乙個區間的雜湊值

#includeusing namespace std; 

char s[1000010];

unsigned long long f[1000010],p[1000010];

int main()

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

return 0;

}

給定乙個字串,求出其最長回文子串。

就是manacher演算法,最長回文串模板題。

#includeusing namespace std;

char s[12000005],st[12000005];

int p[12000005],cnt=0;

int change()

for(unsigned long long i=1;i<=n;i++)rk[sa[i]]=i;

for(unsigned long long i=1;i<=n;i++)

}unsigned long long get_hash(unsigned long long l,unsigned long long r)

//最長公共字首,二分+hash

unsigned long long lcp(unsigned long long x,unsigned long long y)

return l;

}int main()

給定乙個字串s,我們想知道s的字首是否是週期串。

也即對於任意的i∈[2,n],我們想知道以i為長度的s的字首,是否能表示成ak(即字串a可以重複k次)

如:s=aabaabaabaab,其長度n=12。

對於任意2<=i<=12長度的字首我們可以得到:

i=2,長度為2的字首為『aa』,可以表示成a2;

i=3,4,5時的字首都沒有週期串;

i=6,字首為『aabaab』,可以表示成(aab)2;

i=7、8、10、11時的字首都沒有週期串;

i=9,字首為『aabaabaab』,可以表示成(aab)3;

i=12,字首為『aabaabaabaab』,可以表示成(aab)4;

求乙個next陣列,然後手推一下

#includeusing namespace std;

char a[1000010];

int next[1000010],n,t;

void calc_next()

}int main()

}

給定n個字串s1,s2…sn,接下來進行m次詢問,每次詢問給定乙個字串t,求s1~sn中有多少個字串是t的字首。輸入字串的總長度不超過10^6,僅包含小寫字母。

先把給定的字串壓進字典樹,在終點+1,然後詢問時也走字典樹,答案是經過的所有的路徑的累加和

#includeusing namespace std;

int a[2000000],n,m,l,len=1,so[2000000][30];

char s[1000010];

int fd()

}int getans(int ll)

}int getans(int ll)

table[1000010];

int m,n,a,b,q,hash_table[mod],tot;

unsigned sum[1010][1010],power1[1010],power2[1010];

void hash(unsigned x)

bool get_hash(unsigned x)

int main()

for(scanf("%d",&q);q;q--)

return 0;

}

給定兩個項鍊的表示,判斷他們是否可能是一條項鍊。

求兩個字串的最小表示,之後判斷是否相同即可

#includeusing namespace std;

char s1[2000010],s2[2000010];

int n,l,r,k,ans1,ans2;

int main()

else

}ans1=min(l,r);

/*****/

scanf("%s",s2+1);

n=strlen(s2+1),l=1,r=2,k;;

for(int i=1;i<=n;i++)s2[n+i]=s2[i];

while(l<=n&&r<=n)

else

}ans2=min(l,r);

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

}puts("yes");

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

printf("%c",s1[ans1+i-1]);

return 0;

}

每天早晨farmer john的奶牛都會在**時排成矩形,r行(1<=r<=10,000),c列(1<=c<=75)。我們知道,farmer john是奶牛專家,他打算寫一本關於餵養奶牛的書。他發現,當奶牛按照不同的血統標記以後,整個大矩形就像由很多相同的小矩形拼起來的一樣。

請幫助fj找到面積最小的小矩形,使它能拼出整個大矩形。小矩形的尺寸不一定要整除大矩形的,但是小矩形的排列一定要非常整齊,不允許出現錯位之類的情況,即你可以用若干個小矩形拼出乙個包含大矩形的矩形。

比如,對於下面的矩形:

ababa

babab

最小的面積應該是4,而不是2。

就是求出橫向和縱向最小重複的子串,使用kmp的next陣列,和之前週期串的題目相同

#includeusing namespace std;

char s[10010][80],a[80];

int next[10010],i,j,x,y,r,c,f[80];

int main()

if(!s[i][y])f[j]++;}}

for(i=0;i阿軒在紙上寫了兩個字串,分別記為a和b。利用在資料結構與演算法課上學到的知識,他很容易地求出了「字串a從任意位置開始的字尾子串」與「字串b」匹配的長度。

不過阿軒是乙個勤學好問的同學,他向你提出了q個問題:在每個問題中,他給定你乙個整數x,請你告訴他有多少個位置,滿足「字串a從該位置開始的字尾子串」與b匹配的長度恰好為x。

例如:a=aabcde,b=ab,則a有aabcde、abcde、bcde、cde、de、e這6個字尾子串,它們與b=ab的匹配長度分別是1、2、0、0、0、0。因此a有4個位置與b的匹配長度恰好為0,有1個位置的匹配長度恰好為1,有1個位置的匹配長度恰好為2。

求出b對於a的next陣列,之後手推一下

#includeusing namespace std;

int n,m,q,nxt[200010],f[200010],cnt[200010],x;

char a[200010],b[200010];

unsigned long long ha[200010],hb[200010],p[200010];

void nt()

}int main()

for(int i=1;i<=n;i++)cnt[f[i]]++;

for(int i=m;i>=1;i--)cnt[nxt[i]]+=cnt[i];

while(q--)scanf("%d",&x),printf("%d\n",cnt[x]-cnt[x+1]);

return 0;

}

給定一些字串,求這些字串中有無字串是別的字串的字首

可以按長度從大到小排序,之後乙個個壓進字典樹並查詢,也可以全部壓進去後乙個個搜尋

#include#include#include#include#includeusing namespace std;

int a[200000],n,l,len=1,so[200000][10];

string s[10010];

int fd(int x)

int main()

if(!***)for(int i=1;i<=n;i++)

if(***)printf("no\n");

else printf("yes\n");

}return 0;

}

演算法高階 基本資料結構 B

給定n個長度為6的序列,求有無相同的序列,相同序列的定義是順時針或逆時針的最小表示相同 每次將讀進來的序列雜湊一下,做個雜湊表,判斷有無相同序列 includeusing namespace std const unsigned long long inf 160001 unsigned long ...

演算法 基本資料結構

1 後進先出 2 棧有乙個屬性為s.top執行最新插入的元素 3 彈出稱為pop,插入稱為push 4 上溢和下溢 如果試圖對乙個空棧執行彈出操作,則稱為下溢 如果s.top超過了n,則稱為上溢,在下面偽 中不考慮上溢問題 1 先進先出 2 佇列有對頭head和對尾tail 3 插入稱為入隊 enq...

php 基本資料結構 和 演算法

以下的格式不好看,或者到空間的 裡面看吧,那裡的格式規範些。希望對有需要的同學有點幫助吧 基本資料結構 二分查詢 有序陣列裡查詢某個元素 low為待查詢的陣列中的最小值,high為陣列中的最大值,k為要查詢的關鍵字 function bin sch array,low,high,k elseif k...