正则问题
考虑一种简单的正则表达式:
只由 x ( ) | 组成的正则表达式。
小明想求出这个正则表达式能接受的最长字符串的长度。
例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是6。
输入格式
一个由x()|组成的正则表达式。
输出格式
输出所给正则表达式能接受的最长字符串的长度。
数据范围
输入长度不超过100,保证合法。
输入样例:
((xx|xxx)x|(x|xx))xx
输出样例:
6
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
string s;
int k=0;
int dfs()
{
int res=0;
while(k<s.size())
{
if(s[k]=='(')
{
k++;
res+=dfs();
k++;
}
else if(s[k]=='|')
{
k++;
res=max(res,dfs());
}
else if(s[k]==')')
{
break;
}
else
{
k++;
res++;
}
}
return res;
}
int main()
{
cin>>s;
cout<<dfs()<<endl;
return 0;
}
有序分数
给定一个整数 N,请你求出所有分母小于或等于 N,大小在 [0,1]范围内的最简分数,并按从小到大顺序依次输出。
例如,当 N=5 时,所有满足条件的分数按顺序依次为:
0/1,1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4/5,1/1
输入格式
共一行,包含一个整数 N。
输出格式
按照从小到大的顺序,输出所有满足条件的分数。
每个分数占一行,格式为 a/b,其中 a 为分子, b为分母。
数据范围
1≤N≤160
输入样例:
5
//洛谷1458
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,int> num;
int n;
vector<num> nums;
bool cmp(const num& a, const num& b)
{
return (1.0 * a.first / a.second) < (1.0 * b.first / b.second) ;
}
int main()
{
cin >> n;
for(int i = 0; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
int sign = __gcd(i, j);
if ((1.0 * i / j) >= 0 && (1.0 * i / j) <= 1)
{
nums.push_back({i / sign, j / sign});
}
}
}
sort(nums.begin(), nums.end(), cmp);
auto last = unique(nums.begin(), nums.end());//使用unique函数去除重复元素,并返回指向第一个重复元素之后位置的迭代器
nums.erase(last, nums.end());//使用 erase 函数删除重复元素
for(const auto& element : nums)
{
cout << element.first << "/" << element.second << endl;
}
return 0;
}