社区讨论

10 pts 求助

P1624单词缩写参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhjd68e4
此快照首次捕获于
2025/11/04 00:38
4 个月前
此快照最后确认于
2025/11/04 00:38
4 个月前
查看原帖
TLE on 1,2,3,4,6,8,9,10; WA on 5, AC on 7
悬关。
CPP
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using ull=unsigned long long;
using ld=long double;
using pii=pair<int,int>;
#define fi first
#define se second
set<string> invalid;
vector<string> words;
int dp[155][155][155];
inline char tolower(char ch) {
	return (char)ch-'A'+'a';
}
inline char toupper(char ch) {
	return (char)ch-'a'+'A';
}
bool solve() {
	string s;getline(cin,s);
	if(s=="LAST CASE") return 0;
	string abbr="";
	words.clear();
	int pos;
	for(int i=0;i<s.length();i++) {
		if(s[i]==' ') {
			pos=i+1;
			break;
		}
		abbr+=tolower(s[i]);
	}
	string word="";
	for(int i=pos;i<s.length();i++) {
		if(s[i]==' ') {
			if(invalid.find(word)==invalid.end()) words.push_back(word);
			word="";
		}
		else word+=s[i];
	}
	if(invalid.find(word)==invalid.end()) words.push_back(word);
	memset(dp,0,sizeof(dp));
	for(int i=0;i<words[0].length();i++)
		if(abbr[0]==words[0][i]) dp[0][0][i]=1;
	for(int i=0;i<abbr.length()-1;i++)
		for(int j=0;j<words.size();j++)
			for(int k=0;k<words[j].length();k++)
				if(dp[i][j][k]) {
					for(int l=k+1;l<words[j].length();l++)
						if(abbr[i+1]==words[j][l]) dp[i+1][j][l]+=dp[i][j][k];
					if(j<words.size()-1) {
						for(int l=0;l<words[j+1].length();l++)
							if(abbr[i+1]==words[j+1][l]) dp[i+1][j+1][l]+=dp[i][j][k];
					}
				}
	// for(int i=0;i<abbr.length();i++) {
	// 	for(int j=0;j<words.size();j++) {
	// 		for(int k=0;k<words[j].size();k++) cerr<<dp[i][j][k]<<" ";
	// 		cerr<<"\n";
	// 	}
	// 	cerr<<"\n";
	// }
	int ans=0;
	for(int i=0;i<words[words.size()-1].length();i++)
		if(abbr[abbr.length()-1]==words[words.size()-1][i]) ans+=dp[abbr.length()-1][words.size()-1][i];
	for(int i=0;i<abbr.length();i++) abbr[i]=toupper(abbr[i]);
	if(ans>0) cout<<abbr<<" can be formed in "<<ans<<" ways\n";
	else cout<<abbr<<" is not a valid abbreviation\n";
	return 1;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n;cin>>n;
	string s;
	for(int i=1;i<=n;i++) {
		cin>>s;
		invalid.insert(s);
	}
	getline(cin,s);
	while(solve());
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...