示例#1
0
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;
		}
	}
示例#2
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);
	
}
示例#3
0
int main (void)
{
	char src[] = "hello";
	printf("%s\n", src);
	strReverse(src);
	printf("%s\n", src);

	return 0;
}
示例#4
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;
}
示例#5
0
文件: Buf.cpp 项目: gomoku/RenLib
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();
	}
}