#include<bits/stdc++.h>using namespace std;const int MAX = 5020;
int dp[MAX][MAX]; //dp[len][i]表示从i开始长度为len的子串反转是否可以满足,满足为1,不满足为0
int ans = 0;//dp动态规划
void solve()
{string s;cin >> s;int n = s.length();for(int len = 2; len <= n; len ++ ) //遍历每种长度for(int l = 0; l + len - 1 < n; l ++ ) //遍历每个起点{//每次比较最边缘两个,如果不满足则各向中间靠一位再比较(可以直接使用dp)if(s[l] > s[l + len - 1]) dp[l][l + len - 1] = 1;else if(s[l] == s[l + len - 1]) dp[l][l + len - 1] = dp[l + 1][l + len - 2];ans += dp[l][l + len - 1]; //累加答案}cout << ans << endl;
}int main()
{ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);solve();return 0;
}
E.颜色平衡树
#include<bits/stdc++.h>using namespace std;const int N = 2e5 + 5;
int n, ans;
map<int, int>col[N],num[N]; //col[N]每个颜色多少数量,num[N]每个数量有几组
vector<int> e[N];void dfs(int u) //从上到下,u为此时树的根节点
{for(auto &v:e[u]) //所有遍历一遍,自顶向下再自底向上{dfs(v);//合并两树if(col[u].size() < col[v].size()) //u是保持的,v要更新,所以让u更大耗时更少{col[u].swap(col[v]);num[u].swap(num[u]);}for(auto it = col[v].begin();it != col[v].end(); it ++ ){int v_col = it->first, v_num = it->second;if(col[u].count(v_col)) //u树中含有v中该颜色,则要更新num颜色数量组{int u_num = col[u][v_col];num[u][u_num] -- ;if(num[u][u_num] == 0) num[u].erase(u_num);num[u][u_num + v_num] ++ ;}else num[u][v_num] ++ ; //u树不含有则直接添加col[u][v_col] += v_num; //更新col}map<int, int> tmp1, tmp2; //释放vcol[v].swap(tmp1);num[v].swap(tmp2);}if(num[u].size() == 1) ans ++ ; //最大最小都是在一个num上则是满足的
}int main()
{ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n;for(int u = 1; u <= n; u ++ ){int c, fa;cin >> c >> fa;e[fa].push_back(u); //父节点向子节点连一条边col[u][c] ++ ; //此时u节点树中,只有c一种颜色,且只要一个,first是颜色,second是数量num[u][1] ++ ; //此时u节点树中,只有1种颜色的,且其只有一个,first是数量,second是该数量有几套颜色}dfs(1);cout << ans;return 0;
}
H.异或和之和
#include<bits/stdc++.h>using namespace std;/*****思路:*****//*
从前往后遍历
每次遍历该值的所有前缀异或和的每一位的累加值
可以使用i - cnt[j]来表示
最后按位累加即可
*/typedef long long LL;
int cnt[21];//cnt[i]表示第i位为1的可能情况有多少种void solve()
{int n;cin >> n;LL ans = 0;for(int i = 1; i <= n; i ++ ) //从前往后遍历每一个数{int a;cin >> a;for(int j = 0; j <= 20; j ++ ) //遍历每一位{if((1 << j) & a) cnt[j] = i - cnt[j]; //只有该位是1的时候才会有此异或变化ans += 1ll * (1 << j) * cnt[j];}}cout << ans;return;
}int main()
{ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);solve();return 0;
}