1 2 3 4

20210324AtCoder刷题

AGC031 B - Reversi

  • 题意:
    给定长度为n的数字序列,每两个相等的数字可以将其之间的所有数字染色成与之相等的颜色,问:会出现多少种数字序列。

  • 思路:
    考虑DP:
    状态表示:
    f[i] 表示前面长度为i的序列一共的方案数
    状态转移:
    若i前面有与i相等的数(他可以进行染色,产生更多的方案)并且他前面的数与他不相等(相等就没有统计的必要了,这样不会改变方案数,而且前面的与之相等的数会与更前面可以更新的位置进行统计,若这个数再多此一举就会出现重复统计):f[i]=f[i-1]+f[pre[i]]
    否则:f[i]=f[i-1]

  • Code:

#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define ll long long
#define maxn 200005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

inline int read()
{
	int x=0,w=1; char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
	while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
	return w==1?x:-x;
}

ll n,c[maxn],f[maxn],pre[maxn],a[maxn];
ll mod = 1e9+7;
int main()
{
	//freopen("t1.in","r",stdin);
	n=read();
	rep(i,1,n) c[i]=read(),pre[i]=a[c[i]],a[c[i]]=i;
	f[1]=1;
	rep(i,2,n)
	{
		if(pre[i]>0 && c[i]!=c[i-1]) f[i]=(f[pre[i]]+f[i-1])%mod;
		else f[i]=f[i-1];
	}
	printf("%lld\n",f[n]);
	return 0;
}

AGC005 A - STring

  • 题意:
    给定一个由ST组成的字符串,一个一个的删除所有的‘ST’

  • 思路:
    用栈实现:S进栈,T出栈

  • Code:

#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define ll long long
#define maxn 1000005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;

inline int read()
{
	int x=0,w=1; char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
	while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
	return w==1?x:-x;
}

char s[maxn]; 
int t[maxn],p=0;
int main()
{
	//freopen("t1.in","r",stdin);
	scanf("%s",s);
	int l=strlen(s);
	rep(i,0,l-1){
		if(s[i]=='S') t[++p]=1;
		else if(s[i]=='T' && t[p]==1) p--;
		else if(t[p]==-1 || p<=0) t[++p]=-1; 
	}
	printf("%d\n",p);
	return 0;
}
posted @ 2021-03-24 07:55  snuonuo  阅读(38)  评论(0)    收藏  举报