#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; //释放v
col[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;
}
本文推荐一下QGIS中的热门插件:QuickMapService。目前在QGIS插件市场下载量排名第一,先看下官网的介绍: Easy to use list of services and search for finding datasets and basemaps. 言简意赅,用来添加QGIS底图的插件。 插件安装 打开QGIS自带的插件管理器。 在搜索框中…