首页 > 其他分享 >「NOIP赛前冲刺」ABC278F

「NOIP赛前冲刺」ABC278F

时间:2022-11-20 19:45:43浏览次数:42  
标签:const NOIP int text long ABC278F using 赛前 define

Solution

简单状态压缩,考虑设 \(f_{S,i}\) 表示状态为 \(S\) 并且当前要求一个开头为 \(s_i\) 的结尾字符的单词,\(\text{First}\) 如果能赢为 \(0\),否则为 \(1\)。

那么很明显有

\[f_{S|2^{j-1},j}=[f_{S,i}=0]\times[end_i=begin_j] \]

枚举 \(S,i,j\) 即可,时间复杂度为 \(O(2^nn^2)\) ,注意最后如果存在 \(f_{2^{i-1},i}=1\) 代表 \(\text{First}\) 赢,否则代表 \(\text{Second}\) 赢。

Code

#include<bits/stdc++.h>
using namespace std;
using db=double;
using ll=long long;
using vi=vector<int>;
using pii=pair<int,int>;
using ull=unsigned long long;
#define ft first
#define sd second
#define gc getchar
#define pb push_back
#define emp emplace_back
#define mp make_pair
#define sz(a) (int)a.size()
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define ROF(i,a,b) for(int i=a;i>=b;i--)
#define lowbit(x) ((x)&(-x))
#define int long long
const int N=1e5+7;
const int mod=1e9+7;
const int INF=(1ll<<60);
const int inf=1e9;
const int K=5e5+1;
void read(int &x)
{
	char ch=getchar();
	int r=0,w=1;
	while(!isdigit(ch))w=ch=='-'?-1:1,ch=getchar();
	while(isdigit(ch))r=(r<<3)+(r<<1)+(ch^48),ch=getchar();
	x=r*w;
}
void write(int x) {
	char ch[20];
	int len = 0;
	if (x < 0)putchar('-'), x = -x;
	while (x) {
		ch[len++] = (x % 10) ^ 48;
		x /= 10;
	}
	if(len==0)printf("0");
	while (len--)putchar(ch[len]);
	puts("");
}
char s[N];
int x[N],y[N];
bool f[N][30];
signed main()
{
	int n;
	read(n);
	FOR(i,1,n)scanf("%s",s+1),
	x[i]=s[1]-'a'+1,y[i]=s[strlen(s+1)]-'a'+1;
	ROF(S,(1ll<<n)-1,1)
	{
        FOR(i,1,n)
            if(S>>(i-1)&1) 
                FOR(j,1,n)                
                {
                    if(S>>(j-1)&1)continue;
                    int t=S|1ll<<(j-1);
                    if(y[i]==x[j]&&f[t][j]==0) 
                    	f[S][i]=1;
                }
    }
    FOR(i,1,n)
    {
        if(!f[1ll<<(i-1)][i]) 
        {
        	puts("First");
        	return 0;
        }
    }
    puts("Second");
    return 0;
}

标签:const,NOIP,int,text,long,ABC278F,using,赛前,define
From: https://www.cnblogs.com/qinchenhao/p/16909305.html

相关文章

  • [NOIP2017 提高组] 列队
    我有病吧我挑这个题做。题意:$n,m,q\le3e5$解题思路:一眼看上去相当没有头绪。但如果仔细观察的话会发现这种操作本质上是改变某一个编号的位置,将其放在序列最后并......
  • 2022NOIP A层联测30 分配 串串超人 多米诺游戏 大师
    T1[数论/贪心构造]给出n-1对限制形如(i,j,a,b),要求\(xi/xj=a/b\),xi和xj都是正整数。求长度是n的序列x,满足条件(保证给定条件和任意一个数可以唯一确定这个序列)的\(min(\su......
  • NOIP模拟赛Day1
    T1:算是一个小数学题,但是要一些大胆的想法,就是答案不会很大,直接暴力即可。PS:T1一般不会很难,如果感觉没思路可以尝试打表。T2:要求无权图最小环的数量,可以考虑环的求法,例......
  • P7115 [NOIP2020] 移球游戏
    \(\mathcalLink\)很有意思的题目,并没有想象的那么难。首先,为了方便起见,我们可以认为只有两种颜色的球,记为\(0/1\)。考虑如何将\(0/1\)分开,之后多次重复这一过程,每次......
  • NOIP训练测试2(2017081502)
    唔,这是今天第二场训练测试。上一轮不够难,现在来一波更简单的。【滑稽】注意时间!测试时间:3小时题目一:​​​Cantor表​​​题目二:​​​回文数​​​题目三:​​......
  • Cantor表(NOIP1999)
    题目链接:​​Cantor表​​这道题很水,但有的人没看懂题意,这不怪大家,怪题目没说清楚。给张图:看到这,你应该明白题目意思了。先看看有什么规律。我把这个数列写出来:......
  • NOIP训练测试3(2017081601)
    上一波题还是比较水的吧?【?????】也许吧!但时间还是比较紧的,所以我从2.5个小时延长至3个小时了。不管了,做题不能停,今天继续测试。水不水自己看,我什么也不说(zheshizuih......
  • 玩具谜题(NOIP2016)
    题目链接:​​玩具谜题​​​提高组日常水题。直接模拟,有需要注意的点会在代码后讲解:#include<bits/stdc++.h>usingnamespacestd;intmain(){intn,m;scanf("%......
  • 2022NOIP A层联测29 A B C D(特殊数列 数进制数 最短路之和 一笔画)
    T1[状态压缩DP]给出\(n,m,p,q,r\),求长度是n,值域在\([1,m]\)之间的序列个数,满足\(\exists1\leqx<y<z<k\leqn,\)\(sum(x,y-1)=p,sum(y,z-1)=q,sum(z,k)=r\).(n<=50,max(p......
  • 2022NOIPA层联测29
    今天的T3的“部分分”不一定是假做法,比如我写的其它部分是正解好不容易记住了求前缀和,但是求了一个任意两点间最短路?!,而且特判了一个m<=10的小数据枚举排列打算保底结果保没......