/**********************************************************題目大意:給定一個字串,求至少出現k次的最長重複子串,這k個子串可以重疊;演算法分析:這個題和PKU1743的做法差不多;也是先二分答案,然後將尾碼分成若干組;即先用尾碼數組求出height數組;然後利用height數組把排序後的尾碼分成若干組;不同的這裡要判斷有沒有一個組的尾碼個數不小於k;如果有就存在等於k個相同的子串滿足條件,否則就不存在;*****************
/************************************************************題意:有n種不同的長方體磚塊,而且每種磚塊都是取之不盡的;磚塊能夠翻轉,即可以將任意兩邊當底面,剩下的邊當作高;用磚塊疊成最高的塔幫猴子摘得香蕉;但是要保證每塊磚塊的底面兩天邊都要小於它下面那塊磚的底面兩條邊;求能疊塔的最大高度;思路:子問題是以每個矩形為底的塔的最大高度;所有子問題的解中最大的一個就是原問題的解;其中以某個矩形為底的塔的高度可以由自身高度加上可以放在其上的塔
#include <iostream>#include <cstdio>using namespace std;void BiInsertsort(int r[], int n) //折半插入排序{ for(int i=2; i<=n; i++) { if (r[i]<r[i-1]) { r[0] = r[i];//設定哨兵 int low=1,
/********************************************題目大意:給出很多單詞,統計出以某個字串為首碼的單詞數量(單詞本身也是自己的首碼);演算法分析:字典樹模版題;*********************************************/#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<
/*******************************************************題目大意:給定兩個字串A和B,求最長公用子串;演算法思想:字串的任何一個子串都是這個字串的某個尾碼的首碼;求A和B的最長公用子串等價於求A的尾碼和B的尾碼的最長公用首碼的最大值;如果枚舉A和B的所有的尾碼,很明顯效率低下;由於要計算A的尾碼和B的尾碼的最長公用首碼,所以先將第二個字串寫在第一個字串後面,中間用一個沒有出現過的字元隔開,再求這個新的字串的尾碼數組;尾碼是指從某個位置i開始
/*****************************************************題意:Peter邀請朋友參加他的聚會;但是被邀請的人必須滿足:在聚會中至少有A個認識的人和B個不認識的人;求最多有多少人會被他邀請;演算法:根據題目給的資料量,目測這是一道水題;即通過迴圈尋找找到不合法的結點,刪除他對應的關係;然後繼續尋找,直到每一個結點都是合法的;*****************************************************/#include
/*************************************************題目大意:針對每次查詢,輸出第K大數;演算法思想:(1)根據題意可知,只需保留前K個大數,並且按降序排列;也就是說每加入一個數就找到這個數的位置;然後將大於K個元素之外的數刪除;利用優先順序隊列就可以很好的做到;(2)SBT或者樹狀數組解決;**************************************************/#include<iostream>#inc
/**********************************************************************題意:有n個車站, 車站間為有向邊, 可能有重, 無自環;有軍隊要從1號站去n號站,
/* *演算法引入: *求一個圖G中的最小環路的樸素演算法為:每次找到一條邊,刪除了求這兩點之間的最短路徑; *若能求出,則這條最短路徑與原來的邊構成一個環,不過時間複雜度略高; * *演算法思想; *Floyd演算法是按照頂點的編號增加的順序更新最短路徑的; *如果存在最小環,則會在這個環中的點編號最大的那個點u更新最短路徑之前發現這個環; *即當點u被拿來更新i到j的最短路徑的時候,可以發現這個閉合環路; *發現的方法是,更新最短路徑前,遍曆i,j點對,一定會發現某對i到j的最短路徑長度:
/************************************************************************************樹狀數組有一維樹狀數組和二維樹狀數組;主要的問題模型為已知數組a[n],下標從1開始,更改a中的元素,要求得新的a數組中i到j區間內的和;樹狀數組中S[k]儲存的是從k開始向前數k的二進位表示中右邊第一個1所代表的數字個元素的和;即令lowbit為k的二進位表示中右邊第一個1所代表的數字;然後S[k]裡存的就是從a[k]開始向前
第三屆四川大學生ACM/ICPC程式設計競賽,第一次也是最後一次參加省賽,就這樣慘敗了。。。輸得是這麼地徹底。首先從實力上我們沒辦法和電大川大的強隊競爭,在隊內的配合和心態上也是不堪一擊。如果不發現問題、解決問題,即使暑期兩個月發奮努力,在地區賽也會再次杯具的。總拿弱校來安慰自己,可是浙江師範拿金牌進final,我真是震驚了。除去電大川大西交,西民西石油西華都拿過銀牌。雖說我們學校兩院獨立,計科學院一直被我們壓制,直到這次我們全部撲街,他們終於揚眉吐氣。但是西石油的主力竟然是經管學院的...比我
/*********************************************************演算法引入:給定一個完全二分圖G=(X∪Y,X×Y),其中邊(x,y)有權w(x,y);要找一個從X到Y具有最大權和的匹配M,即為二分圖的最優匹配問題;KM(Kuhn_Munkras)演算法求的是完備匹配下的最大權匹配;演算法思想:KM演算法是通過給每個頂點一個標號(叫做頂標)來把求最大權匹配的問題轉化為求完備匹配的問題的;設頂點Xi的頂標為A[i],頂點Yi的頂標為B[i],頂點
/******************************************題目大意:給出一個流量有上下界的容量網路,沒有源點和匯點;求出滿足流量平衡條件的可行流;演算法思想:構建伴隨網路G2:(1)增加附加源點s和附加匯點t;對於每一個點統計流入的總下限sum1,和流出的總下限sum2;求出sum1-sum2,如果大於0則與源點相連,容量為sum1-sum2;如果小於0,則與匯點相連,容量為差的sum2-sum1;(2)保留原網路G1中的每條弧,弧的容量改為c-b;求出伴隨網路的最大
/*********************************************題目地址:http://www.spoj.com/problems/DISUBSTR/題目大意:給定一個字串,求不相同的子串的個數;演算法分析:每個子串一定是某個尾碼的首碼;那麼原問題等價於求所有尾碼之間的不相同的首碼的個數;如果所有的尾碼按照suffix(sa[1]),
/******************************************資料結構:BST(Binary Search Tree),二叉尋找樹;性質:若結點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;若結點的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;該結點的左、右子樹也分別為二叉尋找樹;遍曆:對於一個已知的二叉尋找樹,從小到大輸出其節點的值;只需對其進行二叉樹的中序遍曆即可;即遞迴地先輸出其左子樹,再輸出其本身,然後輸出其右子樹;遍曆的時間複雜度為O(n)
/*********************************************題目地址:http://acm.timus.ru/problem.aspx?space=1&num=1297題目大意:給定一個字串,求最長迴文子串;演算法分析:窮舉每一位,然後計算以這個字元為中心的最長迴文子串;注意這裡要分兩種情況,一是迴文子串的長度為奇數,二是長度為偶數;兩種情況都可以轉化為求一個尾碼和一個反過來寫的尾碼的最長公用首碼;即將整個字串反過來寫在原字串後面,中間用一個特殊的字元隔
/*****************************************題目大意:code==1 則k在排隊,k的優先順序為p;code==2 把優先順序最高的做出列處理;code==3
#include<iostream>#include<string>#include<cstring>#include<cstdio>using namespace std;const int N=100000;//文本串的最大長度const int M=100;//模式串的最大長度int n;//文本串的實際長度int m;//模式串的實際長度char T[N];//文本串char P[M];//模式串int
/******************************************************題意:給出兩個字串a,b,將a串變為b串;每次可以將某一個連續區間變成同一個字元,問最少需要操作多少次;演算法:動態規劃(DP)分析:第一步:設dp[i][j]表示從i到j至少要改變多少次;則狀態轉移方程為:dp[i][j]=min(dp[i+1][j]+(b[i]==b[j]?0:1),dp[i+1][k]+dp[k+1][j](b[i]==b[k]))。第二步:設res[i]表示使長
/********************************************高精度乘法:計算的過程幾乎和最原始的列豎式做乘法相同;在編程處理中,先不要急於進位,在最後統一處理;演算法規律:一個數的第i位和另一個數的第j位相乘所得的數;一定是要累加到結果的第i+j位上;(i,j都是自右向左從0開始計數);********************************************/#include<iostream>#include<cstring>