社区讨论
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 条回复,欢迎继续交流。
正在加载回复...