[NBOJ0030][Penney Game]

[题目要求]
http://acm.bupt.edu.cn/onlinejudge/newoj/showProblem/show_problem.php?problem_id=30

[题目涉及的相关理论与算法]
C++中字符串处理
string类中的find方法

[思路过程]
这个真是水题。。这两天运气好。。题目就是统计给定的字符串里面的不同次序出现的次数。
我原先就会选择用一个字符数组储存,然后相邻的三个平移,把每一个提取出来的结果与八种可能的值比较,分别统计次数。现在既然处于熟悉C++的过程,所以使用的是字符串类,并调用了其中的find方法。

[代码]

#include<iostream>
#include<string>
using namespace std;
void casesolve(int n)
{
	int t;
	cin>>t;
	string table;
	cin>>table;
	string::size_type pos=0,pos2=0;		//C++里面的下表类型不能简单的理解成整形。
	int temp=0;
	cout<<t<<" ";
	pos2 = table.find("TTT",pos);		//这里pos2是辅助pos,储存查找结果下表。
	while(pos2 != string::npos)			//如果不返回npos,说明查找到一个。
	{
		pos = pos2+1;					//下次查找位置从本次查找位置之后加一位再进行。
		pos2 = table.find("TTT",pos);	//重新再查找,并进入下一次循环判断。
		temp++;							//统计次数
	}
	cout<<temp<<" ";					//查找结果输出,下面清零,开始第二个字符串查找。
	temp=0;
	pos=0;
	pos2 = table.find("TTH",pos);		//后面都是重复代码。
	while(pos2 != string::npos)
	{
		pos = pos2+1;
		pos2 = table.find("TTH",pos);
		temp++;
	}	
	cout<<temp<<" ";
	temp=0;
	pos=0;
	pos2 = table.find("THT",pos);
	while(pos2 != string::npos)
	{
		pos = pos2+1;
		pos2 = table.find("THT",pos);
		temp++;
	}	
	cout<<temp<<" ";
	temp=0;
	pos=0;
	pos2 = table.find("THH",pos);
	while(pos2 != string::npos)
	{
		pos = pos2+1;
		pos2 = table.find("THH",pos);
		temp++;
	}
	cout<<temp<<" ";
	temp=0;
	pos=0;
	pos2 = table.find("HTT",pos);
	while(pos2 != string::npos)
	{
		pos = pos2+1;
		pos2 = table.find("HTT",pos);
		temp++;
	}	
	cout<<temp<<" ";
	temp=0;
	pos=0;
	pos2 = table.find("HTH",pos);
	while(pos2 != string::npos)
	{
		pos = pos2+1;
		pos2 = table.find("HTH",pos);
		temp++;
	}	
	cout<<temp<<" ";
	temp=0;
	pos=0;
	pos2 = table.find("HHT",pos);
	while(pos2 != string::npos)
	{
		pos = pos2+1;
		pos2 = table.find("HHT",pos);
		temp++;
	}	
	cout<<temp<<" ";
	temp=0;
	pos=0;
	pos2 = table.find("HHH",pos);
	while(pos2 != string::npos)
	{
		pos = pos2+1;
		pos2 = table.find("HHH",pos);
		temp++;
	}
	cout<<temp<<endl;
}
int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);
	int n;
	cin>>n;
	while((n--) != 0)
	{
		casesolve(n);
	}
	return 0;
	//fclose(stdin);
	//fclose(stdout);
}

[尾声]
代码的结果,速度还可以,我相信如果字符串变得足够大的情况下会比直接数组更快。开始要用getline,但是发现getline对读入string类型没太搞清楚,后面花时间再学习!每天一点进步,送上今天听的一首轻松的歌曲~

 

你可能感兴趣的:(String类,ACM,字符串查找,PenneyGame)