給定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...