首页 > 其他分享 >题解:SP1703 ACMAKER - ACM (ACronymMaker)

题解:SP1703 ACMAKER - ACM (ACronymMaker)

时间:2024-10-02 17:33:29浏览次数:10  
标签:缩写 word dp2 int 题解 单词 SP1703 ACronymMaker dp

题目大意:

一个有一些单词组成的短语,给定一个缩写词,求此缩写由此短语的单词组成的可能方案数。注意,短语中所有重要的单词都要用到,顺序必须和缩写词单词顺序一致。

思路

动态规划设置:

  • \(dp_{i,j}\):使用前 \(i\) 个重要单词形成前 \(j\) 个缩写字符的方法数。
  • \(dp2_{k,m}\):辅助数组,用于帮助转移,其中 \(k\) 索引当前单词的字符,\(m\) 索引缩写的字符。

转移方程

\(dp2\) 数组转移:

  • \(dp2_{k+1,m+1}\gets dp2{k,m+1}\) 处理当前单词字符不用于匹配当前缩写字符的情况。
  • \(dp2_{k+1,m+1}\gets dp2_{k+1,m+1}+dp2_{k,m}\),处理当前单词字符匹配当前缩写字符的情况。

\(dp\) 数组转移:

  • \(dp_{i+1,j+k}\gets dp{i+1,j+k}+dp_{i,j} \cdot dp2_{size,k}\),考虑使用当前单词匹配缩写的所有方式。

代码:

#include<bits/stdc++.h>
#define wrhlovezcx true
using namespace std;
int main(){
	while(wrhlovezcx){
		int n;
		cin>>n;
		if(n==0) return 0;
		set<string> ig;
		for(int i=0;i<n;i++){
			string s;
			cin>>s;
			ig.insert(s);
		}
		while(wrhlovezcx){
			string acm;
			cin>>acm;
			cin.ignore();
			string phrase;
			getline(cin,phrase);
			if(phrase=="CASE") break;
			istringstream iss(phrase);
			vector<string> words;
			while(wrhlovezcx){
				string word;
				iss>>word;
				if(word=="") break;
				if(ig.find(word)==ig.end()){
					words.push_back(word);
				}
			}
			int dp[151][151];
			memset(dp,0,sizeof(dp));
			dp[0][0]=1;
			int dp2[151][151];
			for(int i=0;i<words.size();i++){
				for(int j=0;j<acm.length();j++){
					int mx=min(acm.length()-j,words[i].length());
					for(int k=0;k<=words[i].length();k++){
						dp2[k][0]=1;
					}
					for(int k=1;k<=mx;k++){
						dp2[0][k]=0;
					}
					for(int k=0;k<words[i].length();k++){
						for(int m=0;m<mx;m++){
							dp2[k+1][m+1]=dp2[k][m+1];
							if(words[i][k]==tolower(acm[j+m])){
								dp2[k+1][m+1] += dp2[k][m];
							}
						}
					}
					for(int k=1;k<=mx;k++){
						dp[i+1][j+k]+=dp[i][j]*dp2[words[i].length()][k];
					}
				}
			}
			if(dp[words.size()][acm.length()]==0){
				cout<<acm<<" is not a valid abbreviation"<<endl;
			}else{
				cout<<acm<<" can be formed in "<<dp[words.size()][acm.length()]<<" ways"<<endl;
			}
		}
	}
}

标签:缩写,word,dp2,int,题解,单词,SP1703,ACronymMaker,dp
From: https://www.cnblogs.com/cly312/p/18444905

相关文章

  • 题解:SP4557 ANARC08H - Musical Chairs
    约瑟夫问题,由于问题涉及大量的删除和查找操作,直接用数组模拟会超时,可以用树状数组题意在每一轮游戏中,我们需要从当前的孩子位置开始数数,并淘汰第\(D\)个孩子。游戏需要不断地从剩下的孩子中进行选择并淘汰,直到只剩下最后一个孩子。注意两个点将树状数组的位置设为\(1\)......
  • 59_初识搜索引擎_搜索相关参数梳理以及bouncing results问题解决方案
    1、preference决定了哪些shard会被用来执行搜索操作_primary,_primary_first,_local,_only_node:xyz,_prefer_node:xyz,_shards:2,3bouncingresults问题,两个document排序,field值相同;不同的shard上,可能排序不同;每次请求轮询打到不同的replicashard上;每次页面上看到的搜索......
  • 操作系统错题解析【软考】
    目录前言1.特殊的操作系统1.1可移植性1.2嵌入式操作系统2.进程的状态2.1调度方式2.2进程通信运行实例3.信号量的取值范围3.1PV操作中信号量分析4.信号量于PV操作4.1PV操作4.2初值5.死锁资源数计算6.进程资源图7.页式存储8.段页式存储9.磁盘管理9.1计算读取时间9.2......
  • 01 交换串 题解
    题意简述给定一个长为\(n\)的\(\tt01\)串\(s\),你需要对\(s\)进行恰好\(m\)次交换,每次只能交换相邻的不同字符,最大化操作后\(s\)的价值。\(s\)的价值被定义为,对于每一个\(i\),记\(1\simi-1\)中,和\(s_i\)不同的\(s_j\)有\(l\)个,\(r\)同理,\(f(s_i,i,l,......
  • CSP-S/NOIP提高组 真题题解总结
    DP:线性dpP1091[NOIP2004提高组]合唱队形比较简单的一道题。求出以\(i\)结尾的最长上升子序列和以\(i\)为头的最长下降子序列,相加\(-1\)即可。P1052[NOIP2005提高组]过河如果不考虑\(L\)的范围,那么就是一道简单的线性dp。但是\(L\)很大,石头数量很少,......
  • 区间 题解
    题意简述求长度为\(n\)的序列\(a\)的最长连续子序列\([l,r]\),满足\(\existsi\in[l,r],\gcd(a_l,\ldots,a_r)=a_i\)。\(1\leqn\leq4\times10^6\),\(1\leqa_i\leq10^{18}\)。题目分析根据\(\gcd(a,b)=a\)等价于\(b\bmoda=0\),这个区间的限......
  • 题解 P2726 【[SHOI2005]树的双中心】
    首先,我们会有一个很简单的想法,枚举断边,产生两棵子树,然后在两棵树内分别求带权重心,计算贡献,这样的话复杂度是\(O(n^2)\)的。那么我们要好好利用$h\leq100$的性质。考虑\(sze[u]\)为带权重量,\(g[u]\)为以\(u\)为根的树,所有点都到\(u\)的代价。所以\(g[u]=\sum\l......
  • AT_abc373_e 的题解
    (一)二分套二分。(感觉是一个很麻烦的做法。)题目问的是让额外给的票最少,考虑二分答案。设二分的答案为\(x\),该候选人原来的得票为\(v\),想要超过他至少要\(x+v+1\)。同时用前缀和维护区间和。第一种情况为该候选人在前\(m\)个人中,如下图所示。绿色箭头为被讨论的人,蓝色箭......
  • 优美函数 题解
    题意简述给你函数\(f\):\[f(x,y,u)=\left\{\begin{array}{rcl}u-y,&x=1\\u,&1<x\ley,\\gcd(x,y)=1\\-x\cdoty,&x\neq1,\\gcd(x,y)=x\\0,&\text{otherwise}.\end{array}\right.\]对于一个长度为\(n\)的序列......
  • ABC 模拟赛 | A Passing Contest 001题解记录(A,B,C,D)
    比赛链接https://www.luogu.com.cn/contest/126344[APC001]A-CT不必多说,多次取模#include<iostream>#include<algorithm>#include<string>#include<string.h>#include<queue>#include<deque>#include<math.h>#include<map>......