题意:有一个只包含'(',')','?'的字符串,'?'可以被当作'('或者')'。统计串s中所有的非空完美子串的数目。
思维,模拟。
看了两篇博客,有两种解题方法,实际上都差不多。
第一种:(博客链接:https://blog.csdn.net/a302549450/article/details/83351238)
#include<bits/stdc++.h>
#define mem(a,b) memset((a),b,sizeof(a))
typedef long long ll;
const int N=100010;
using namespace std;
char a[5010];
ll ans;
int main()
{
ans=0;
scanf("%s",a+1);
int n=strlen(a+1);
for(int i=1;i<=n;i++)
{
if(a[i]==')')
continue;
int sum=0,num=0;
for(int j=i;j<=n;j++)
{
if(a[j]=='(')
sum++;
if(a[j]==')')
sum--;
if(a[j]=='?')
{num++;sum--;}
if(sum==0)
ans++;
if(sum<0)
{
if(num<=0)
break;
num--;
sum+=2;
}
}
}
printf("%I64d",ans);
return 0;
}
第二种:(博客链接:https://www.cnblogs.com/siuginhung/p/8387067.html)
#include<bits/stdc++.h>
#define mem(a,b) memset((a),b,sizeof(a))
typedef long long ll;
const int N=100010;
using namespace std;
char a[5010];
ll ans;
int main()
{
ans=0;
scanf("%s",a+1);
int n=strlen(a+1);
for(int i=1;i<=n;i++)
{
if(a[i]==')')
continue;
int sup=0,inf=0;
for(int j=i;j<=n;j++)
{
if(a[j]=='(')
{sup++;inf++;}
if(a[j]==')')
{sup--;inf--;}
if(a[j]=='?')
{sup++;inf--;}
if(sup<0)
break;
if(inf<0)
inf=0;
if(inf==0&&(j-i+1)%2==0)
ans++;
}
}
printf("%I64d",ans);
return 0;
}