See More

/** *³ÌÐòÔ±±à³ÌÒÕÊõµÚÒ»~¶þÊ®ÆßÕ¼¯½õÓë×ܽᣨ½ÌÄãÈçºÎ±à³Ì) * * * */ #include #include #include #include #include #include #include using namespace std; /** *µÚÒ»ÕÂ.×óÐý×Ö·û´® * */ void ReverseOrder(char *pcStr, int nLen) { char c = NULL; int nLow, nHigh; nLow = 0; nHigh = nLen - 1; while (nLow < nHigh) { c = pcStr[nLow]; pcStr[nLow] = pcStr[nHigh]; pcStr[nHigh] = c; ++nLow; --nHigh; } } //Èý´ÎÄæÐò void RotateString1(char *pcStr, int k, int nSize) { ReverseOrder(pcStr, k); ReverseOrder(pcStr + k, 4); ReverseOrder(pcStr, nSize); } int gcd(int n, int m) { int r; if (n < m) { r = n; n = m; m = r; } while ((r = m%n) != 0) { m = n; n = r; } return n; } //ÔËÓÃ(j + i*m)%n (j = 0-gcd(n,m), i = 0-(n/gcd(n,m) - 1)) void RotateString2(string &str, int m) { int nStrLen, nGcd, nElemInSub, j, i; nStrLen = str.length(); nGcd = gcd(nStrLen, m); nElemInSub = nStrLen/nGcd; for (j = 0; j < nGcd; ++j) { char Tmp = str[j]; for (i = 0; i < nElemInSub - 1; ++i) { str[(j + i*m)%nStrLen] = str[(j + (i+1)*m)%nStrLen]; } str[(j + i*m)%nStrLen] = Tmp; } } /** *µÚ¶þÕÅ.×Ö·û´®ÊÇ·ñ°üº¬¼°Ïà¹ØÎÊÌâÀ©Õ¹ * */ /* *¼ÙÉèÕâÓÐÒ»¸ö¸÷ÖÖ×Öĸ×é³ÉµÄ×Ö·û´®£¬¼ÙÉèÕ⻹ÓÐÁíÍâÒ»¸ö×Ö·û´®£¬ *¶øÇÒÕâ¸ö×Ö·û´®ÀïµÄ×ÖĸÊýÏà¶ÔÉÙһЩ¡£´ÓËã·¨Êǽ²£¬ *ʲô·½·¨ÄÜ×î¿ìµÄ²é³öËùÓÐС×Ö·û´®ÀïµÄ×ÖĸÔÚ´ó×Ö·û´®Àï¶¼ÓУ¿ * */ int IsExistEveryChar1(string &ls, string &ss) { int i, index, nums = 0; int nArray[26] = {0}; for (i = 0; i < ss.length(); ++i) { index = ss[i] - 'A'; if (nArray[index] == 0) { nArray[index] = 1; ++nums; } } for (i = 0; i < ls.length(); ++i) { index = ls[i] - 'A'; if (nArray[index] == 1) { if (--nums == 0) break; } } return (i < ls.length()) ?0:-1; } //ÿ¸ö×Ö·û¶ÔÓ¦Ò»¸öËØÊý int IsExistEveryChar2(string &ls, string &ss) { int i, index; int primeNumber[26] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101}; long long product = 1; for (i = 0; i < ls.length(); ++i) { index = ls[i] - 'A'; product *= primeNumber[index]; } for (i = 0; i < ss.length(); ++i) { index = ss[i] - 'A'; if (product % primeNumber[index] != 0) return -1; } return 0; } /** *×Ö·û´®Æ¥Åäe.g: ABCDE--CD */ char* MyStrStr(char *pcStr, char *pcSubStr) { char *p = NULL, *pSub = NULL; p = pcStr; pSub = pcSubStr; while (*p != '\0' && *pSub != '\0') { if (*p == *pSub) { ++p; ++pSub; } else { p -= (pSub - pcSubStr - 1); pSub = pcSubStr; } } return (*pSub == '\0')? p - strlen(pcSubStr): NULL; } /** *×Ö·û´®¿½±´ */ char* mystrcpy(char *pcDest, const char *pcSrc) { if (pcSrc == NULL || pcDest == NULL) return NULL; char *pcAddr = pcDest; while ((*pcDest++ = *pcSrc++) != '\0'); return pcAddr; } /** *×Ö·û´®È«ÅÅÁÐ * */ void SwapChar(char *pcDest, char *pcSrc) { char tmp; if (pcDest == NULL || pcSrc == NULL) return; tmp = *pcSrc; *pcSrc = *pcDest; *pcDest = tmp; } void StrArrange(char *pcStr, char *pcBegin) { if (*pcBegin == '\0') { cout << pcStr << " "; return; } for (char *pcPos = pcBegin; *pcPos != '\0'; ++pcPos) { SwapChar(pcBegin, pcPos); StrArrange(pcStr, pcBegin + 1); SwapChar(pcBegin, pcPos); } } /** *×Ö·û´®µÄËùÓÐ×éºÏ */ void StrCombination(char *pcStr, char *pcDest) { char acDest1[32] = {0}, acDest2[32] = {0}; if (*pcStr == '\0') { cout << pcDest << " "; return; } strcpy_s(acDest1, pcDest); strcpy_s(acDest2, pcDest); acDest1[strlen(acDest1)] = *pcStr; StrCombination(pcStr+1, acDest1); StrCombination(pcStr+1, acDest2); } /** *µÚÈýÕÂ.topkÎÊÌâ * */ //¿ìËÙÅÅÐòµÄÒ»´Î»®·Ö(Ñ¡ÔñµÚÒ»¸öÔªËØ×÷Ϊ»®·ÖÖµ) int Partition(int *pnArray, int nBegin, int nEnd) { int nValue; nValue = pnArray[nBegin]; while (nBegin < nEnd) { while (pnArray[nEnd] >= nValue) --nEnd; pnArray[nBegin] = pnArray[nEnd]; while (pnArray[nBegin] <= nValue) ++nBegin; pnArray[nEnd] = pnArray[nBegin]; } pnArray[nBegin] = nValue; return nBegin; } int SwapInt(int *p, int *q) { int tmp; if (p == NULL || q == NULL) return -1; tmp = *p; *p = *q; *q = tmp; return 0; } //Ëæ»ú»®·Ö int RandomizedPartition(int *pnArray, int nBegin, int nEnd) { int nRand; srand(time(NULL)); nRand = (rand()%(nEnd - nBegin)) + nBegin; SwapInt(pnArray, pnArray + nRand); return Partition(pnArray, nBegin, nEnd); } //Ëæ»úÑ¡ÔñµÚKСµÄÔªËØ int RandomizedSelect(int *pnArray, int nBegin, int nEnd, int k) { int q; if (nBegin > nEnd) return -1; if (nBegin == nEnd) return pnArray[nBegin]; q = RandomizedPartition(pnArray, nBegin, nEnd); if (k == q) return pnArray[q]; else if (k < q) return RandomizedSelect(pnArray, nBegin, q - 1, k); else if (k > q) return RandomizedSelect(pnArray, q + 1, nEnd, k - q); return -1; } void printarray(int *pnArray, int size) { int i; for (i = 0; i < size; ++i) { cout << pnArray[i] << " "; } cout << endl; } //ÓöÑÅÅÐòµÃµ½×îСµÄK¸öÊý void HeapAdjust(int *pnArray, int i, int size) { int child, tmp; for (tmp = pnArray[i]; 2*i + 1 < size; i = child) { child = 2 * i + 1; if (child < size-1 && pnArray[child] > pnArray[child + 1]) ++child; if (tmp > pnArray[child]) pnArray[i] = pnArray[child]; else break; pnArray[child] = tmp; } } void MakeMinHeap(int *pnArray, int size) { int i; for (i = size/2; i >= 0; --i) { HeapAdjust(pnArray, i, size); } } int GetHeapMin(int *pnArray, int size, int k) { int i, h, min, tmp, child; min = pnArray[0]; SwapInt(pnArray, pnArray + size - 1); h = k - 1; i = 0; for (tmp = pnArray[0];h > 0 && 2*i + 1 < size; --h, i = child) { child = 2 * i + 1; if (child >= size-1) break; if (pnArray[child] > pnArray[child + 1]) ++child; if (tmp > pnArray[child]) pnArray[i] = pnArray[child]; else break; pnArray[child] = tmp; } return min; } void GetKMin(int *pnArray, int size, int k) { int i; MakeMinHeap(pnArray, size); for (i = 0; i < k; ++i) { int min = GetHeapMin(pnArray, size - i, k - i); cout << min << " "; } cout << endl; } /** *µÚÁùÕÂ.Çó500wÄÚµÄÇ׺ÍÊý *Ç׺ÍÊý: mºÍnΪÇ׺ÍÊý£¬ÔòmµÄÕæÒò×ÓÖ®ºÍΪn, nµÄÕæÒò×ÓÖ®ºÍΪm; */ void QinNum(unsigned int n) { int i, j; int *sum = NULL; if ((sum = (int *)malloc(n*sizeof(int))) == NULL) return; for (i = 0; i < n; ++i) sum[i] = 1; for (i = 2; i*2 < n; ++i) { j = 2*i; while (j < n) { sum[j] += i; j += i; } } for (i = 2; i < n; ++i) { if (sum[i] > i && sum[i] < n && sum[sum[i]] == i) { cout << sum[i] << " " << i << endl; } } free(sum); } /** *µÚÆßÕÂ.ÇóÁ¬Ðø×ÓÊý×éµÄ×î´óºÍ * */ int MaxSum(int *a, int size) { int i, sum, tmp; sum = 0; tmp = 0; for (i = 0; i < size; ++i) { if (tmp < 0) tmp = a[i]; else tmp += a[i]; if (sum < tmp) sum = tmp; } return 0; } /** *µÚ°ËÕÂ.̽ÌÖÐ麯Êý */ class Base { private: virtual void f() { cout << "Base::f" << endl; } }; class Derive : public Base { }; typedef void(*Fun)(void); /** *µÚ¾ÅÕÂ.Á´±íÎÊÌâ *1.ÅжÏÁ´±íÊÇ·ñÓл·¡ª¡ª¿ìÂýÁ´±íÖ¸Õë *2.ÅжÏÁ´±íÊÇ·ñÏཻ *3.ÕÒ³öÏཻµÄµÚÒ»¸öµã * */ //µÚÊ®¶þ ~Ê®ÎåÕ£ºÖÐÇ©¸ÅÂÊ£¬ IP ·ÃÎÊ´ÎÊý£¬»ØÎÄµÈ //µÚ¶þ²¿·Ö¡¢±éÀú n¸öÔªËØÈ¡³öµÈ ¸ÅÂÊËæ»úÈ¡³öÆäÖÐÖ®Ò»ÔªËØ //α´úÂë //Element RandomPick(file): // Int length = 1; // While( length <= file.size ) // { // If( rand() % length == 0) // Picked = File[length]; // Length++; // } // Return picked /* int main(int argc, char *argv[]) { //int anArray[] = {2, 3, 5, 8, 7, 6, 1, 4, 9}; //GetKMin(anArray, 9, 5); //cout << endl; // QinNum(5000000); Derive d; Fun pFun = (Fun)*((int*)*(int*)(&d)+0); pFun(); return 0; } */ /* void CreateSuffixArray(uchar* szText, int L, int** _S, int** _R, int** _T1, int** _T2) { int i, h, h2, *T, *S1, *S2, *R, *B; S1 = *_S; // h½×ºó׺Êý×é S2 = *_T1; // 2h½×ºó׺Êý×é R = *_R; // h½×RankÊý×é B = *_T2; // ij¸öͰ¿ÕÓà¿Õ¼äβ²¿µÄË÷Òý£¬¼æÈÎ2h½×RankÊý×é // »¨O(n)µÄʱ¼ä¶Ôh = 1½øÐмÆÊýÅÅÐò for(i = 0; i < 256; i++) B = 0; for(i = 0; i < L; i++) B[szText]++; for(i = 1; i < 256; i++) B += B[i - 1]; for(i = 0; i < L; i++) S1[--B[szText]] = i; // ¼ÆËãRank(1)£¬ÒòΪ½ö½öÊÇ1½×µÄRank£¬ËùÓÐÓв¢ÁÐµÄ for(R[S1[0]] = 0, i = 1; i < L; i++) { if(szText[S1] == szText[S1[i - 1]]) R[S1] = R[S1[i - 1]]; else R[S1] = R[S1[i - 1]] + 1; } // log(n)ÌËO(n)µÄ±¶ÔöÅÅÐò // SA(h) => Rank(h) => SA(2h) => Rank(2h) => ¡­ 32 33 for(h = 1; h < L && R[S1[L - 1]] < L - 1; h <<= 1) 34 { 35 // ¼ÆËãRank(h)ÏàͬµÄºó׺ÐγɵÄhͰβ²¿µÄË÷Òý 36 // ¼´ÓжàÉÙ¸öºó׺µÄhǰ׺Ïàͬ£¬ËüÃDZ»·ÅÔÚÒ»¸öͰÖÐ 37 for(i = 0; i < L; i++) 38 B[R[S1]] = i; 39 40 // ÇóSA(2h) 41 // ÔÚͬһ¸öhͰÖУ¬ËùÓеĺó׺µÄhǰ׺¿Ï¶¨Ïàͬ£¬ 42 // ÄÇô±È½ÏËûÃǵÄ2hǰ׺£¬Ö»Òª±È½ÏÆä2hǰ׺ºó°ëµÄ 43 // ³¤¶ÈΪhµÄ´®¼´¿É£¬¶øÕâ¸ö´®Ç¡Ç¡ÊǺóÃæÄ³¸öºó׺µÄ 44 // hǰ׺£¬ËùÒÔÎÒÃÇÄæÏò±éÀúÓÐÐòµÄSA(h)£¬ 45 // ½«S1 ¨C hºÅǰ׺·Åµ½ËüËùÔÚͰµÄ×îºóÒ»¸ö¿ÕλÖ㬠46 // ͬʱ£¬Í°Î²Ç°½øÒ»¸öλÖã¬ÕâÑù¼´ÐγÉÁË2hͰÅÅÐò 47 for(i = L ¨C 1; i >= 0; i¨C) 48 if(h <= S1) 49 S2[B[R[S1 - h]]¨C] = S1 ¨C h; 50 51 // ¶ÔÓÚ³¤¶È²»³¬¹ýhµÄ×îºó¼¸¸öºó׺£¬ÓÉÓÚÔÚh½×¶Î 52 // ËüÃÇÿ¸öʵ¼ÊÉ϶¼ÒѾ­¶ÀÁ¢·ÖͰÁË(³¤¶ÈΪhµÄÒ²ÊÇ) 53 // ¶øÇÒËûÃǵÄͰÖÐÓÐÇÒ½öÓÐÒ»¸öÔªËØ£¬ 54 // ËùÒÔÖ»ÒªÖ±½Ó¸´ÖÆËûÃÇh½×¶ÎµÄSAÖµ¾Í¿ÉÒÔÁË 55 // ͬʱ£¬ÓÉÓÚ²ÉÓùö¶¯Êý×飬ËùÒÔS2ÖС°²ÐÁô¡±ÁË 56 // h/2¸öÓÐЧµÄÊý¾Ý£¬ËùÒÔ×îÖÕÎÒÃÇÖ»Ðè¸´ÖÆh/2¸öÊý¾Ý 57 for(i = L ¨C h, h2 = L ¨C (h >> 1); i < h2; i++) 58 S2[B[R]] = i; 59 60 T = S1; S1 = S2; S2 = T; 61 62 // ¼ÆËãRank(2h) 63 // 2h½×¶ÎÊÇ·ñÒª·ÖͰֻÐè¿´ÏàÁÚÁ½¸ö2hǰ׺ǰºóÁ½°ë 64 // hǰ׺ÊÇ·ñÈ«²¿h½×ÏàµÈ 65 for(B[S1[0]] = 0, i = 1; i < L; i++) 66 { 67 // ÕâÀï²»Óÿ¼ÂÇS1 + h»áÔ½½ç 68 // Èç¹ûi´ïµ½ÁËS1 + hÔ½½çµÄÊýÖµ£¬ 69 // ÄÇÃ´Ç°ÃæÒ»¸öÌõ¼þÏÔÈ»²»»áÂú×ãÁË 70 // ÒòΪ´Ëʱiǰ׺¿Ï¶¨ÒѾ­¶ÀÁ¢·ÖͰÁË 71 if(R[S1] != R[S1[i - 1]] || 72 R[S1 + h] != R[S1[i - 1] + h]) 73 { 74 B[S1] = B[S1[i - 1]] + 1; 75 } 76 else 77 B[S1] = B[S1[i - 1]]; 78 } 79 80 T = B; B = R; R = T; 81 } 82 83 if(*_S != S1) 84 *_S = S1, *_T1 = S2; 85 if(*_R != R) 86 *_R = R, *_T2 = B; 87 } const int N = 20005;//´®AµÄ×î´ó³¤¶È const int MAX = 1000100;//´®AµÄ×î´óÖµ //int n,m,k; int SA[N], rank[N], height[N], key[N]; int A[N], C[MAX], t1[N+1], t2[N+1]; //±¶Ôö·¨Çósa[]-----´ýÅÅÐòµÄ×Ö·û´®·ÅÔÚr Êý×éÖУ¬r[]ΪÕûÐÍÊý×é, ´Ór[0]µ½r[n-1]£¬³¤¶ÈΪn£¬ÇÒ×î´óֵСÓÚm //Ô¼¶¨³ýr[n-1]ÍâËùÓеÄr[i]¶¼´óÓÚ0, r[n-1]=0 //½á¹û·ÅÔÚsa Êý×éÖУ¬´Ósa[0]µ½sa[n-1] //ÏȶÔËùÓкó׺µÄµÚÒ»¸ö×Ö·û½øÐÐÅÅÐò(²ÉÓÃÍÚ¿ÓʽµÄ»ùÊýÅÅÐò,¼´Í³¼ÆÃ¿¸ö×Ö·ûµÄ¸öÊý,ÒÔ±ãÔÚɨÃèʱ×ÜÄܽ«×Ö·û·ÅÈëºÏÊʵÄλÖÃ),·ÅÈësaÖÐ void da(int n, int m) { int i, j, l, s,*t; int *X = t1, *Y = t2; memset(C, 0, sizeof(C)); for (i=0; i < n; i++) C[X[i] = A[i]]++; for (i=1; i < m; i++) C[i] += C[i-1]; for (i=n-1; i >= 0; i--) SA[--C[X[i]]] = i; for (l=1; l= l) Y[j++] = SA[i] - l; for (i=0;i=0;i--) SA[--C[key[i]]] = Y[i]; t = X; X = Y; Y = t; X[SA[0]] = j = 0; for (i=1;i 0) --k; if(rank[i] == 0) height[0] = 0; else { j = SA[rank[i] - 1]; while(A[i+k] == A[j+k]) k++; height[rank[i]] = k; } } } void main(void) { int i; //´®A[0]...A[n-1] for (i = 0; i < 10; ++i) { A[i] = 'a' + i; } A[3] = 'f'; da(10,1000001); //mµÄ×î´óÖµ²»³¬¹ý1,000,000 for (i = 0; i < 10; ++i) { printf("%d ", SA[i]); } printf("\n"); calheight(10); } */