首页 > 其他分享 >8.20总结

8.20总结

时间:2022-08-20 15:16:43浏览次数:101  
标签:总结 ch int 无界 while 8.20 len getchar

Blue Mary的战役地图

\(solution\)
暴力卡常
时间复杂度较高\(O(n^7)\)
优化后可过:

倒叙枚举边长,一旦找到就输出

AC Code
#include<bits/stdc++.h>
using namespace std;

inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}

const int N=55;
int n;
int a[N][N],b[N][N];

bool dfs(int x,int y,int k)
{
	for(int i=1;i<=n-k+1;i++)
	{
		for(int j=1;j<=n-k+1;j++)
		{
			if(b[i][j]==a[x][y])
			{
				int o=0;
				for(int s=0;s<k;s++)
				{
					for(int w=0;w<k;w++)
					{
						if(a[x+s][y+w]!=b[i+s][j+w])
						{
							o=1;
							break;
						}
					}
					if(o==1)break;
				}
				if(o==0)return true;
			}
		}
	}
	return false;
}

int main()
{
//	freopen("map.in","r",stdin);
//	freopen("map.out","w",stdout);
	n=read();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			a[i][j]=read();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			b[i][j]=read();
	int ans=0;
	for(int k=n;k>=1;k--)
	{
		for(int i=1;i<=n-k+1;i++)
		{
			for(int j=1;j<=n-k+1;j++)
			{
				if(dfs(i,j,k))
				{
					ans=k;
					printf("%d\n",ans);
					return 0;
				}
			}
		}
	}
	return 0;
}

无界单词

\(solution\)
对于总的无界单词的个数,我们考虑用dp来解决。

设计状态\(f_i\)表示长度为i的无界单词个数,由此可得转移方程为:\(f_i=2^{i}-\sum_{j=1}^{i/2}{f_{j}*2^{i-2*j}}\)

然后我们来考虑第k小的无界单词

kmp预处理+dp找在已经确定了len长的串后的无界单词个数

转移方程为:\(f_{i}=2^{i-len}-\sum_{j=1}^{i/2}{a_j}\)

分类讨论:

  1. \(len\leq j,a_j=f_{j}*2^{i-j*2}\)
  2. 否则\(len\leq i-j,a_j=f_j*2^{i-len-j}\)
  3. 否则,判断\(w_{1\cdots len-i+j}\)和\(w_{1\cdots len}\)是否相等,如果不相等\(w_j=1,k-=f[n]\)
AC Code
#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
inline ull read()
{
	ull x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}

ull t,n,k,qow[100];
ull nex[100],w[100],f[100];

void kmp(int len)
{
	for(int i=2,j=0;i<=len;i++)
	{
		while(j>0&&w[j+1]!=w[i])j=nex[j];
		if(w[j+1]==w[i])j++;
		nex[i]=j;
	}
}

ull init(int len)
{
	memset(f,0,sizeof f);
	for(int i=1;i<=n;i++)
	{
		if(i<=len)
		{
			f[i]=!nex[i];
			continue;
		}
		f[i]=qow[i-len];
		for(int j=1;j<=i/2;j++)
		{
			if(j>=len)f[i]-=f[j]*qow[i-j*2];
			else if(len<=i-j)f[i]-=f[j]*qow[i-len-j];
			else if(f[j])
			{
				int o=0;
				for(int s=1,p=i-j+1;p<=len;++p,++s)
				{
					if(w[s]!=w[p])
					{
						o=1;break;
					}
				}
				if(!o)f[i]--;
			}
		}
	}
	return f[n];
}

int main()
{
//	freopen("word.in","r",stdin);
//	freopen("word.out","w",stdout);
	t=read();
	qow[0]=1;
	for(int i=1;i<=64;i++)
	qow[i]=qow[i-1]*2;
	while(t--)
	{
		n=read(),k=read();
		memset(f,0,sizeof f);
		for(int i=1;i<=n;i++)
		{
			f[i]=qow[i];
			for(int j=1;j<=i/2;j++)
			f[i]-=f[j]*qow[i-2*j];
		}
		cout<<f[n]<<endl;
		for(int i=1;i<=n;i++)
		{
			w[i]=0;kmp(i);
			ull tmp=init(i);
			if(tmp<k)w[i]=1,k-=tmp;
		}
		for(int i=1;i<=n;i++)
		{
			if(w[i]==1)printf("b");
			else printf("a");
		}
		printf("\n");
	}
	return 0;
}

标签:总结,ch,int,无界,while,8.20,len,getchar
From: https://www.cnblogs.com/mkik/p/16607731.html

相关文章

  • 2022/8/20 总结
    A.P4398[JSOI2008]BlueMary的战役地图考场写了个暴力,我还以为要挂了,结果这题暴力可过;Solution本来想写\(\mathtt{O(n^6)}\)的暴力,但感觉可能过不了,所以加了亿点......
  • 集训3/4总结
    这几次考试题难度和在家集训五天的难度差不多,但是考试状态好了很多,故成绩还看得过去。感觉基本集训几天第一次学的算法都没太学懂,还需要自己去复习。上新课的速度没我想的......
  • 集训总结
    集训总结收获学习了一些从未接触的数据结构:线段树,树状数组,单调栈,单调队列可以实现一些基本操作,但与灵活运用还有一定距离,也无法与其他算法相结合使用提升了图......
  • 信2105-3班张少阳20213904第八周java学习总结
    本周进一步深入学习了类以及接口的用法,区别以及类似点1.3接口的成员特点1)成员变量:只能是常量,默认修饰符publicstaticfinal2)构造方法接口没有构造方法,因为接口主要是......
  • 算法总结
    1.每日温度题(一道关于栈的问题)请根据每日气温列表temperatures ,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后......
  • 2022暑假集训总结
    经过简介7月20日到达内江天立学校,在小学部的机房上课。这里没什么人,比较安静,也没有那么热,学习环境挺好的。开始是老姚给我们上的课,主要讲了tarjan,然后由几位学长讲课。期......
  • 20220819总结
    这次考试太烂了,又没考过Diavolo。T1简单的入门题,先热身。#include<iostream>#defineintlonglong#defineN5001usingnamespacestd;intn,ans;doublea[N]......
  • 8.19总结
    啊~,本周的第一个暴零所罗门王的宝藏\(solution\)第一眼的时候完全没有想到是图论,当然暴零不是这个原因把行和列进行连边,因为行i的旋转次数+列j的旋转次数一定等于\(c_{......
  • 2022暑假集训总结
    2022暑假集训总结收获做了██道题跟着多校联训学的时候,主要收获是学会了一些基本的暴力算法和一些以前不知道的算法概念后来高烧休息了几天回来以后主要的收获是考试......
  • 浙里办微信小程序总结
    浙里办微信小程序单点登录流程1.获取浙里办跳转地址中ticket或者微信小程序中的ticketIdletticket=getQueryString("ticket",window.location.href);letsp......