字符串处理专题(持续更新)

字符串输入格式

开文第一篇,想先捋一下字符串输入的形式与方法。各路大神已经总结的很多了,我就归纳一下自己常用的方法,自给自足了。

字符串存储可以使用char* 或者string类型,输入时要注意需要存储的字符串是否包含空格。

#include 
#include 
#include 
#include 
using namespace std;

string str;
char *s;
1. cin & scanf 输入

注:cin从缓冲区中读入一个字符串,遇到“空格”、“制表”、“回车”都结束,且未存入的其他字符串保留于缓冲区当中。所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入。结束符不保留于缓存中

printf效果也同上,但结束符会保留于缓存中,可以用 getchar() 吸收。

cin >> str;
cin >> s;

scanf("%s", s);
scanf("%s", str.c_str());
2. getline() & gets() 输入

注:getline(cin, string)可以读入空格,且回车符不保留于缓存中,需要引入

gets(char *)可以读入空格,且回车符不保留于缓存中。

getline(cin, str, '\n'); // 最后一个参数是读入结束符,默认为'\n'。

gets(s);

eg1. PAT B1040 有几个PAT
字符串处理专题(持续更新)_第1张图片

思路分析

对于每一个’A’而言,它所能构成的PAT数目 = 左边的’P’数量 * 右边的’T’数量。对其求和,即为最终的结果。

但如果对每一个’A’都计算它左右的’P’、'T’数量一定会超时,所以此处运用打表的思想,将每个位置的左P、右T都先存下来,将大大减少运算量。

代码(AC)

#include 
#include 
#include 
#include 
#include 
using namespace std;

const int M = 1000000007;
const int maxn = 100010;
int P[maxn], T[maxn];

int main()
{
	string str;
	cin >> str;
	memset(P, sizeof(P), 0);
	memset(T, sizeof(T), 0);
	for(int i=0; i<str.size(); i++)
	{
		if(str[i] == 'P')
		{
			P[i] = P[i-1] + 1;
		}
		else 
		{
			P[i] = P[i-1];
		}
	}
	for(int i=str.size()-1; i>=0; i--)
	{
		if(str[i] == 'T')
		{
			T[i] = T[i+1] + 1;
		}
		else 
		{
			T[i] = T[i+1]; 
		} 
	}
	int ans = 0;
	for(int i=0; i<str.size(); i++)
	{
		if(str[i] == 'A')
		{
			ans = (ans + P[i]*T[i]) % M;
		}
	}
	cout << ans;
	
	return 0;
}

你可能感兴趣的:(机试)