题目链接:https://codeforces.com/contest/18/problem/D
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
static const int MAXN=5000+10;
vector<int> f[MAXN];
vector<int> dp[MAXN];
vector<int> add(vector<int> &A, vector<int> &B)
{
vector<int> C;
for (int i = 0, t = 0; i < A.size() || i < B.size() || t; i++)
{
if (i < A.size()) t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
}
return C;
}
vector<int> mul(vector<int> &A, int b)
{
vector<int> C;
for (int i = 0, t = 0; i < A.size() || t; i++)
{
if (i < A.size()) t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
return C;
}
int n,k;
char str[10];
int pre[MAXN];
void init()
{
f[0].push_back(1);
for(int i=1;i<=2000;i++)
f[i]=mul(f[i-1],2);
}
int main()
{
scanf("%d",&n);
init();
dp[0].push_back(0);
for(int i=1;i<=n;i++)
{
scanf("%s%d",str,&k);
dp[i]=dp[i-1];
if(str[0]=='w') pre[k]=i;
else if(pre[k])
{
vector<int> tmp=add(dp[pre[k]],f[k]);
if(tmp.size()>dp[i].size()) dp[i]=tmp;
else if(tmp.size()==dp[i].size())
{
int k=tmp.size()-1;
while(k>0 && tmp[k]==dp[i][k]) k--;
if(tmp[k]>dp[i][k]) dp[i]=tmp;
}
}
}
for(int i=dp[n].size()-1;i>=0;i--) printf("%d",dp[n][i]);
printf("\n");
return 0;
}