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 }
本文来自博客园,作者:江上舟摇,转载请注明原文链接:https://www.cnblogs.com/LQS-blog/p/17004104.html