AtCoder Grand Contest 031 A--C

A - Colorful Subsequence

/**
题意:给定目标串S(由小写字母构成),统计取出S的字符组成的不同串的个数;
define :不同串:
              1 :不同位置的相同字符
              2 :一个串不存在相同的字符
思路:统计每个小写字母的数量,考虑每个字母存在 取1个与不取 的情况,累乘即可
最后去除空的情况
*/

#include
#define ll long long 
using namespace std;

const ll mod = 1e9+7;
const int maxn = 1e5+7;
ll sum[27];

int main (){
    int n;cin>>n;
    string s;cin>>s;
    memset(sum,0,sizeof(sum));
    for(int i=0;i

B - Reversi

/**
题意:从给定数组中,选择两个相同的数字,可将相同数字之间的数字变为和该相同数字一样,该操作可以进行不定次数;
思路:考虑存在交叉的情况,记录相邻相等数的位置,利用鸽巢定理直接进行dp即可;
*/

#include
#define ll long long 
using namespace std;

const ll mod = 1e9+7;
const int maxn = 5e5+7;

int pre[maxn],pos[maxn],a[maxn];;
ll dp[maxn];

int main (){
    int n;cin>>n;
    for(int i=0;i>a[i];
    for(int i=1;i<=n;i++) pre[i]=pos[a[i]],pos[a[i]]=i;
    dp[0]=1;
    for(int i=1;i<=n;i++){
        dp[i]=dp[i-1];
        if(pre[i]!=0&&pre[i]!=i-1) dp[i]=(dp[i]+dp[pre[i]])%mod;
    }
    cout<

C - Differ by 1 Bit

/**
题意:构造首尾已知,中间相邻二进制1的个数相差等于1的数组;
思路:构造,先考虑不满足的情况,分析后直接对a,b进行拆分即可
*/

#include
#define ll long long
using namespace std;

std::vector dfs(int n,int a,int b){
    if(n==1) return {a,b};
    b^=a;
    int step=-1;
    for(int i=0;i p=dfs(n-1,0,1);
    std::vector q=dfs(n-1,1,(b^(1<>1);
    std::vector vec;
    for(int i=0;i<(int)p.size();i++) {
        int a=p[i]>>step,b=p[i]&((1<>step,b=q[i]&((1<>n>>a>>b;
    if(__builtin_parity(a^b)==0) {
        puts("NO");
        return 0;
    }
    std::vector vec = dfs(n,a,b);
    puts("YES");
    for(auto x:vec) cout<

 

你可能感兴趣的:(At,Coder)