首页 > 其他分享 >AtCoder Beginner Contest 278-F

AtCoder Beginner Contest 278-F

时间:2022-11-21 13:12:11浏览次数:52  
标签:AtCoder typedef const Beginner Contest ll 278 dp

F - Shiritori

题解:n最大16,所以可以状态压缩,相当于n个点的带权有向图。
dp[i][j]表示当前状态为i,j结尾的情况,其中dp[i][j]=1表示First赢,0为second赢,如果一个字符串s[i],第一个字符为j,那么如果dp[k][s[i].back()]为1那么,dp[i][j]为0,反之亦然,其中最后的状态,就是dp[(1<<n)-1][j]肯定为1,因为First可以选择直接从这个状态开始。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
const ll mod=1e9+7;
typedef pair<ll,ll> pll;
#define endl '\n'
ll n;
string s[N];
ll dp[1<<16][30];
signed main(){
  ios::sync_with_stdio(false);
  cin.tie(0);cout.tie(0);
  ll n;cin>>n;
  for(ll i=0;i<n;i++) cin>>s[i];
  for(ll i=(1<<n)-1;i;i--){
    for(ll k=0;k<26;k++){
      ll pt=1;
      for(ll j=0;j<n;j++){
        if((1<<j)&i) continue;//判断当前状态中包不包含这个字符串
        if(s[j][0]!=k+'a') continue;//判断能收尾接上
        if(dp[i|(1<<j)][s[j].back()-'a']){//如果为1便是0
          pt=0;break;
        }
      }
      dp[i][k]=pt;
    }
  }
  for(ll i=0;i<n;i++){
    if(dp[1<<i][s[i].back()-'a']){
      cout<<"First"<<endl;return 0;
    }
  }
  cout<<"Second"<<endl;
}

标签:AtCoder,typedef,const,Beginner,Contest,ll,278,dp
From: https://www.cnblogs.com/hhzp/p/16911116.html

相关文章

  • ABC278 整合题解
    AA题,送分题。link。思路数据范围很小,其实直接模拟也是可以通过的。不过我们很容易想到\(O(n)\)的算法。对于前\(k\)个数,不输出,其他数正常输出。然后再在末尾......
  • ABC278F 题解
    前言题目传送门!或许更好的阅读体验?博弈论,状压,记忆化搜索。思路看到很小的\(n\),容易联想到状压、搜索。本题就是状压加搜索。设状态\(x\)的每一位表示:如果第\(i\)......
  • ABC278D 题解
    前言题目传送门!更好的阅读体验?难度加强版:P1253。思路很容易想到线段树。维护\(cov_i\)表示覆盖的懒标记。单点加与单点查都非常简单。全局覆盖只需要给每一层都打......
  • AtCoder Beignner Contest 278
    D给定一个长度为\(n\)的序列,有如下三种操作:把所有的数全部修改为\(x\)把第\(i\)个数加\(x\)输出第\(i\)个数的值不难发现,每次一操作会覆盖之前的所有操作,所......
  • 「NOIP赛前冲刺」ABC278F
    Solution简单状态压缩,考虑设\(f_{S,i}\)表示状态为\(S\)并且当前要求一个开头为\(s_i\)的结尾字符的单词,\(\text{First}\)如果能赢为\(0\),否则为\(1\)。那么很......
  • AtCoder Beginner Contest 278
    A-Shift原题链接题意给定一个有\(n\)个整数的数组\(a\),要求进行以下\(k\)次操作,输出操作后的数组。操作为:将第一个数去掉,在队尾加上一个\(0\)。分析依题意模......
  • AtCoder Beginner Contest 278
    A-Shift(abc278a)题目大意给定一个有\(n\)个整数的数组\(a\),要求进行以下\(k\)次操作,输出操作后的数组。操作为:将第一个数去掉,在队尾加上一个\(0\)。解题思路模......
  • AtCoder Regular Contest 150补题
    AtCoderRegularContest150A.Continuous1知识点:简单题复杂度:\(O(n)\)当一个区间合法,那么必定区间长度为k,并且区间内无0,并且1的个数等于所有的1的总和这个使用个......
  • AtCoder Beginner Contest 278
    咕咕咕。D-AllAssignPointAdd把数拆分成\(base+delta\)。\(base\)就是操作一设置的数,初始时认为\(base=0\);\(delta\)的维护可以有两种方法。一种是我比......
  • AtCoder Beginner Contest 278-D
    D-AllAssignPointAdd 题目链接:https://atcoder.jp/contests/abc278/tasks/abc278_d刚开始的思路是进行操作1的时候,将整个数组都赋成......