vector<int> BoyerMoore(const string& str, istream& in) { //----------stopTable-- int stopTable[256]; for(int i = 0; i < 256; ++i) stopTable[i] = 0; for(int i = 0; i < str.length(); ++i) stopTable[unsigned char(str[i])] = i; //------------------- vector<int> suffTable(str.length() + 1); PrefixFunc pref(str); string strReverse(str.length(), 'a'); for(int i = 0; i < str.length(); ++i) strReverse[i] = str[str.length() - i - 1]; PrefixFunc prefReverse(strReverse); for(int i = 0; i < str.length() + 1; ++i) suffTable[i] = str.length() - pref[str.length() - 1]; for(int i = 1; i < str.length(); ++i) { int j = prefReverse[i]; if(j != 0) suffTable[j] = min(suffTable[j], i - j + 1); } //----------- int posEnd = str.length() - 1; int posCompare = 0; string text = ""; char c; while(in >> c) text = text + c; //------------ vector<int> result; while(posEnd < text.length()) { bool flag = true; while(posCompare < str.length()) { if(str[str.length() - 1 - posCompare] != text[posEnd - posCompare]) { flag = false; break; } ++posCompare; } if(flag) { result.push_back(posEnd - str.length() + 1); ++posEnd; posCompare = 0; } else { if(posCompare > 0) posEnd += shift(text[posEnd - posCompare], str[0], str.length() - posCompare - 1, stopTable[unsigned char(text[posEnd - posCompare])], suffTable[posCompare - 1]); else posEnd += shift(text[posEnd - posCompare], str[0], str.length() - posCompare - 1, stopTable[unsigned char(text[posEnd - posCompare])], 1); posCompare = 0; } }
int main (int argc, char* argv[]) { char str[] = {"Every good boy does fine."}; char str2[30] = {"Every good boy does fine."}; char str3[30] = {""}; //Test Word Count int wordCount = strWordCount(str); printf("Word count: %d\n", wordCount); //end test word count // //Test str to upper. strToUpper(str, str2); printStringArray(str); printStringArray(str2); //end test str to upper. // //Test str Strip char c = 'o'; strStrip(str, c, str2); printStringArray(str); printStringArray(str2); //end test str Strip // //Test str Substring char d[] = {"boy"}; printf("Where does the word boy start? %d", strIsSubstring(str, d)); //end test str is Substring // //Test strSubstitute char e, g; e = 'g'; g = 'o'; strSubstitute(str, e, g, str2); printStringArray(str); printStringArray(str2); //end test strSubstitute // //Test strReverse strReverse(str, str2); printStringArray(str); printStringArray(str2); //Test Palindrome char tacocat[] = {"tacocat"}; printf("Is tacocat a Palindrome? %d", strPalindrome(tacocat)); //end palindrome test // //Test strSplit strSplit (str, 'o', 3, str3, str2); printf("The starting str\n"); printStringArray(str); printf("The second half of str\n"); printStringArray(str2); printf("The first half of str\n"); printStringArray(str3); }
int main (void) { char src[] = "hello"; printf("%s\n", src); strReverse(src); printf("%s\n", src); return 0; }
/* * 打印真值表 * bPrint : 是否输出到StdOut */ int *print_table(const char *exp, ExpInfo *info, Bool bPrint) { int *result; int i, j, cols, rows, tmp, count; char *suffix, row[MAX_LETTERS]; cols = info->cols; rows = info->rows; result = (int *)calloc(rows , sizeof(int)); if (bPrint) { for (i = 0; i < MAX_LETTERS; ++i) { if (info->elem[i]) { printf("\t%c", i + 'A'); } } printf("\t%s\n", exp); } suffix = infix_to_suffix(exp); for (i = 0; i < rows; i++) { count = 0; tmp = i; memset(row, 0, sizeof(row)); /* 通过将十进制转换成二进制来生成每行的序列 */ do { row[count++] = tmp % 2; tmp /= 2; } while (tmp != 0); strReverse(row, cols); result[i] = eval(row, suffix, info); if (bPrint) { for (j = 0; j < cols; j++) { printf("\t%d", row[j]); } printf("\t%d\n", result[i]); } } free(suffix); return result; }
void Buf::Next() { BYTE buffer[RecordSize]; m_Game.clear(); if ((m_dwRead = m_bufFile.Read(buffer, RecordSize)) && (buffer[0] != 0)) { bool isTime = false; bool isReverse = false; bool isDraw = false; bool isBlackWin = false; bool isWhiteWin = false; CString strBlackPlayer; CString strWhitePlayer; for (int i = 0; i < StartIndex; i++) { if (buffer[i] > 127) { buffer[i] -= 100; if (i == 24) { isTime = true; } else if (i == 25) { isDraw = true; } else if (i == 26) { isReverse = false; } else if (i == 27) { isWhiteWin = true; } else if (i == 28) { isBlackWin = true; } else if (i == 29) { isReverse = true; } } } for (i = 0; i < 15; i++) { strBlackPlayer += buffer[i]; } for (i = 15; i < 30; i++) { strWhitePlayer += buffer[i]; } Utils::trim(strBlackPlayer); Utils::trim(strWhitePlayer); CString strResult; if (isDraw) { strResult = "0.5 - 0.5"; } else if (isBlackWin) { strResult = "1 - 0"; } else //if (isWhiteWin) { strResult = "0 - 1"; } CString str5A("?"); for (i=StartIndex; i < RecordSize; i++) { if (buffer[i] == 0) { break; } int y = 16 - (buffer[i] + 14) / 15; int x = (buffer[i] + 14) % 15 + 1; if (i == StartIndex && (x != 8 || y != 8)) { str5A.Format( "%s%s", Utils::XCoordinateImage(x, true, false), Utils::YCoordinateImage(y, false)); x = 8; y = 8; } m_Game.addPos(BYTE((15-y) * 16 + x)); } const int lastMove = m_Game.numberOfMoves(); const CString strResultComment(strBlackPlayer + " - " + strWhitePlayer + " " + strResult); m_Game.addOneLineComment(lastMove, strResultComment); CString strFileAndNumber; strFileAndNumber.Format("File: %s, No: %d", m_bufFile.GetFileTitle(), m_nRecord); m_Game.addMultiLineComment(lastMove, strFileAndNumber); CString strReverse("Reverse: "); strReverse += (isReverse ? "R" : "-"); m_Game.addMultiLineComment(lastMove, strReverse); m_Game.addMultiLineComment(lastMove, "5A: " + str5A); if (isTime) { m_Game.addMultiLineComment(lastMove, "Time loss"); } m_nRecord++; } if (Done()) { m_bufFile.Close(); } }