本文是接着上一篇(1条消息) c语言之 练习题3 大贤者福尔(乘积),镂空等腰三角形,目录列表_水w的博客-CSDN博客
目录
字符串变换
大贤者福尔最近开始研究字符串的变换问题,他提出了一个变换规则,使得一个字符串经过一系列变换之后,生成另一个字符串,他把这两个字符串称作等价串。
具体变换规则为:初始状态下有一个长度为NN的字符串A,另有B、C两个空串。变换的规则是:从A串的第一个字符开始,依次取出串中的每个字符,可以选择将取出的字符直接放入字符串B或C的尾部。若字符串A或B中还有字符,可以继续从A中按顺序取出单个字符放入串B或C的尾部,也可以选择从串B的尾部取出单个字符并放入串C的尾部,最终使得串A、B为空串,串C为最终的变换结果,作为串A的等价串。
- 输入:输入数据有若干组,每组包含两个长度均不超过N (1 \le N \le 100 )N(1≤N≤100)的字符串,字符串由大小写字母、数字和其他可打印字符组成。
- 输出:对每组输入数据,在单独的行中输出如
Case x: ans
的结果信息,其中ans为对应的结果。若给定的两个串为等价串,ans为Yes
,否则为No
。- 示例输入:
ABCDE ABCDE ABCDE CABDE A ABCDE
- 示例输出:
Case 1: Yes Case 2: No Case 3: No
代码1:python
if __name__ == '__main__':
import sys
lines = list(map(str.strip, sys.stdin.readlines()))
lines = [[lines[i], lines[i + 1]] for i in range(0, len(lines), 2)]
for id, line in enumerate(lines):
str_1, str_2 = line
A, B, C = [x for x in str_1], [], [x for x in str_2]
while A:
B.append(A[0])
A = A[1:]
while B and B[-1] == C[0]:
B = B[:-1]
C = C[1:]
if C:
print(f'Case {id + 1}: No')
else:
print(f'Case {id + 1}: Yes')
代码2:c++
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
using namespace std;
string s1,s2;
void solve()
{
queue<char> q1, q2;
stack<char> s;
for (int i = 0; i < int(s1.length()); i++){
q1.push(s1[i]);
}
for (int i = 0; i < int(s2.length()); i++){
q2.push(s2[i]);
}
while (!q1.empty()){
while (s.empty() || s.top() != q2.front()){
if (q1.empty())
break;
s.push(q1.front());
q1.pop();
}
while (!s.empty() && s.top() == q2.front()){
s.pop();
q2.pop();
}
}
if (q2.empty()){
cout << "Yes" << endl;
}
else
cout << "No" << endl;
}
int main(){
int cnt = 1;
while (cin>>s1>>s2){
cout<<"Case "<<(cnt++)<<": ";
solve();
}
return 0;
}
执行结果:
语料字典
小A正在开展面向领域的自然语言处理研究,这项工作的第一步就是建立语料字典,即从给定的语料库中,分割并提取相应的词汇,并将词汇按某种顺序排列,从而发现该领域中的标识性词汇,为进一步研究奠定基础。
这项工作费时费力且比较枯燥,需要去掉语句中的标点符号、连字符等,还有去掉所有格,并按空白进行单词分割,实在是太麻烦了,他希望你能够编写一个计算机程序帮他解决这个问题。
- 输入:输入数据不超过500行,每行最多包括200个ASCII码大小写子母和标点符号,单词之间以空格分隔。
- 输出:输出小写形式的所有单词。单词不区分大小写,由26个英文字母构成。请按单词出现次数从高到低及字典序依次输出所有的单词,要求每个单词在单独的行中输出。
- 示例输入:
Peter's Adventures in Disneyland Two blondes were going to Disneyland when they came to a fork in the road. The sign read: "Disneyland Left." So they went home.
- 示例输出:
disneyland in the they to a adventures blondes came fork going home left peter read road sign so two went were when
代码1:c++
#include <bits/stdc++.h>
using namespace std;
map<string, int> mp;
deque<string> deq;
stack<string> sta;
set<string> st;
string s, op;
bool fun () { //是否存在s的熟人,如果存在返会true
while (!sta.empty()) sta.pop();
if (st.count(s) == 0) return false;
int size = deq.size();
bool flag = false;
while (size--) {
if (st.count(deq.back()) != 0) {
if (mp[s] == mp[deq.back()]) flag = true;
}
sta.push(deq.back());
deq.pop_back();
}
while (!sta.empty()) {
deq.push_back(sta.top());
sta.pop();
}
return flag;
}
void init() {
mp.clear();
deq.clear();
while (!sta.empty()) sta.pop();
}
int main () {
int n, m, cnt = 1, size;
while (cin >> n) {
if (n != 0) {
cout << "Case #" << cnt << ":" << endl;
cnt++;
}
init();
for (int i = 0; i < n; i++) {
cin >> m;
for (int j = 0; j < m; j++) {
cin >> s;
mp[s] = i;
st.insert(s);
}
}
while (true) {
cin >> op;
if (op == "stop") break;
if (op == "enqueue") {
cin >> s;
if (deq.size() == 0 || st.count(s) == 0) {
deq.push_back(s);
continue;
}
if (fun()) {
size = deq.size();
while (size--) {
if (st.count(deq.back()) != 0) {
if (mp[s] == mp[deq.back()]) {
deq.push_back(s);
break;
}
}
sta.push(deq.back());
deq.pop_back();
}
while (!sta.empty()) {
deq.push_back(sta.top());
sta.pop();
}
} else {
deq.push_back(s);
}
}
}
}
}
代码2:python
import re
li = []
res = {}
while True:
try:
s = input().split()
for i in range(len(s)):
s[i] = s[i].lower()
if "'s" in s[i]:
s[i] = re.sub("'s", '', s[i])
s[i] = ''.join(list(x for x in s[i] if x.isalpha()))
li.extend(list(i for i in s if i.isalpha()))
except EOFError:
break
for i in sorted(li):
res[i] = li.count(i)
for i in sorted(res.items(), key=lambda item: item[1], reverse=True):
print(i[0])
特殊单词
一篇文章由有若干个单词构成,小A希望知道文章中有哪些特殊单词。所谓特殊单词是指,构成这个单词的字母经过顺序变换形成的一个新单词也出现在文章中。与原单词构成的字母对比,新单词的字母可以有大小变化。
小A希望知道文章中这样的特殊单词有哪些,您能帮他找出来吗?
- 输入:输入数据有若干行,每行为一个字符串,由空格分隔开,单词由大小写字符及数字构成,每个单词长度不超过30个ASCII码字符。若该行字符为
#
,表示输入结束。- 输出:按不区分大小写的字典序输出所有的特殊单词,所有特殊单词按其第一次在文章中出现的形式输出,每行输出一个单词。
- 示例输入:
a aa sd 12 aaa Bd dB BD c a 21 A aa aaa #
- 示例输出:
12 Bd a
代码1:python
if __name__ == '__main__':
words = []
while True:
line = input()
if line == '#':
break
words += line.split()
words = list(dict.fromkeys(words))
new_words = {}
for word in words:
new_word = ''.join(sorted([char.lower() for char in word]))
if new_word in new_words:
new_words[new_word] = [new_words[new_word][0]+1, new_words[new_word][1]]
else:
new_words[new_word] = [1, word]
output = [new_words[key][1] for key in new_words if new_words[key][0] > 1]
output.sort()
print("\n".join(output))
代码2:python
str2=[]
str=[]
def loca(st,list):
site=[]
for i in range(len(list)):
if list[i]==st:
site.append(i)
return site
while True:
str1=input().split()
if str1[0]=='#':
break
str =str + str1
for i in str:
if i not in str2:
str2.append(i)
str1=str2.copy()
for i in range(len(str1)):
flag1=str1[i]
flag1 = flag1.lower()
flag1=list(flag1)
flag1.sort()
flag1="".join(flag1)
str1[i]=flag1
str3 = []
str4=[]
for i in str1:
if i not in str3:
str3.append(i)
for i in range(len(str3)):
if str1.count(str3[i])>1:
list=loca(str3[i],str1)
for j in range(len(list)):
if str3[i]!=str2[list[j]]:
str4.append(str2[list[0]])
break
str4.sort()
for j in str4:
print(j)
代码3:c++
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
string str1[1000], str4[1000];
string str2, str3;
map<string, string>ma;
int ans = 0;
int bns = 0;
int main() {
cin >> str2;
while (str2 != "#") {
str3 = str2;
transform(str2.begin(), str2.end(), str2.begin(), ::tolower);
str1[ans] += str2;
++ans;
sort(str2.begin(), str2.end());
if (ma[str2] == ""){
ma[str2] = str3;
}
else {
if (ma[str2] != str3){
str4[bns++] = ma[str2];
}
}
cin >> str2;
}
sort(str4, str4 + bns);
int y = unique(str4, str4 + bns) - str4;
for (int i = 0; i < y; i++){
cout << str4[i] << endl;
}
return 0;
}