AT282 C+AT283 D

c:

题目大意是给定字符串只含有小写,','和'';保证''的数量是偶数个的同时让2k为''的个数

规定从1......k的i,每个2*i-1~2*i区间内的字符是封闭的

你的任务是用'.'替换掉不在封闭区间内的','并打印替换之后的字符串

不算很难,跟着题目走一遍就行

code:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define int long long
 4 #define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
 5 const int N=2e5+10;
 6 string s;
 7 int n;
 8 int k;//''的个数
 9 bool vis[N];//标记封闭区间
10 int post[N];//记录''的位置
11 int zz=1;//虚拟化指针
12 signed main()
13 {
14     IOS;
15     cin>>n;
16     cin>>s;
17     for(int i=0;i<n;i++)
18     {
19         if(s[i]=='"')
20         {
21             post[zz++]=i;    
22             k++;
23         }
24     }
25     k=k/2;//2k为''的个数
26     int p=s.find('"');//在字符串中查找第一个''的位置
27     vis[p]=true;
28     for(int i=1;i<=k;i++)
29     {
30         for(int j=post[2*i-1];j<=post[2*i];j++)//从2*i-1~2*i的区间为封闭区间
31         {
32             vis[j]=true;
33         }
34     }
35     for(int i=0;i<s.length();i++)
36     {
37         if(!vis[i]&&s[i]==',')
38         s[i]='.';//替换非封闭区间的',';
39     }
40     for(int i=0;i<n;i++)
41     {
42         cout<<s[i];
43     }
44     return 0;
45 }

D:

给定一个字符串包含小写字母,'(',  ')',要求去除字母后如果可以实现括号一一匹配则为好串(注意,这里并不是括号序列匹配)

但是,如果在碰到')'之前有重复字母,则匹配终止

正面样例解释:

如((a)ba)

因为删除所有小写英文字母会得到 (()),我们可以从中删除第 2 个和第 3 个字符处的连续 () 以获得 (),这又以空字符串结束。

反面样例解释:

(a(ba))

碰到'(‘不操作,a入栈,'('不操作,b入栈

a入栈,此时栈里已经存在a,则操作终止

思路:样例已经很明显了,就是说如果在匹配到')'的时候要清空前一个相匹配的'('之间的所有字母,如果有重复的就终止,没有就继续遍历字符串

那这样就要先来记录每个匹配的'('的位置,然后在删除他们之间的字母,判重可以用set

code:

 1 //当时做的时候考虑到了如果是碰到')'就要把与其匹配的''内的所有字母都删除,但是当时采用了vector,超时了
 2 //这道题采用的也是这样的思想
 3 //先用st来记录'('的位置,p用来记录与')'匹配的'('的位置
 4 //然后遍历,如果是碰到小写的检查集合内有没有重复的,有就No
 5 //没有的话就插入集合并且用stk栈来记录字母和他的位置
 6 //如果碰到')'就删除p[i]到当前位置的所有字母同时更新集合
 7 //最后判断flag的真假决定Yes or No
 8 #include<bits/stdc++.h>
 9 using namespace std;
10 #define int long long 
11 #define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
12 const int N=3e5+10;
13 int p[N];//记录与')'匹配的已入栈的'('的位置
14 string s;
15 set<char>q;//用来判断是否出现重复的字符
16 stack<int>st;//记录'('的栈
17 stack<pair<char,int>>stk;//记录字符与其位置的栈
18 bool flag=true;
19 signed main()
20 {
21     IOS;
22     getline(cin,s);
23     for(int i=0;i<s.length();i++)
24     {
25         if(s[i]=='(')
26         {
27             st.push(i);
28         }
29         else if(s[i]==')')
30         {
31             p[i]=st.top();
32             st.pop();
33         }
34     }
35     for(int i=0;i<s.length();i++)
36     {
37         if(islower(s[i]))
38         {
39             if(q.find(s[i])!=q.end())
40             {
41                 flag=false;
42                 break;
43             }
44             q.insert(s[i]);
45             stk.push({s[i],i});
46         }
47         else if(s[i]==')')
48         {
49             int f=p[i];
50             while(!stk.empty()&&stk.top().second>f)
51             {
52                 q.erase(stk.top().first);
53                 stk.pop();
54             }
55         }
56     }
57     if(flag)
58     cout<<"Yes"<<endl;
59     else
60     cout<<"No"<<endl;
61     return 0;
62 }

 

posted @ 2022-12-25 15:36  江上舟摇  阅读(16)  评论(0编辑  收藏  举报