1.codevs2058括号序列
其实很简单,遇到左括号无条件入栈,如果栈为空或者当前符号与栈顶不匹配,ok=false,否则匹配成功,t--出栈,当栈为空即所有元素都匹配成功且栈顶指针没有越界时输出true,否则输出false
1 #include <bits/stdc++.h> 2 #define For(i,l,r) for(int i=(l);i<=(r);i++) 3 using namespace std; 4 char a[4000008]; 5 char s[5000000]; 6 int t; 7 int main(){ 8 int n,len; 9 bool ok; 10 scanf("%d\n",&n); 11 For(i,1,n){ 12 scanf("%s",s); 13 t=0; 14 len=strlen(s); 15 ok=true; 16 For(j,0,len-1){ 17 if(s[j]==‘{‘ || s[j]==‘(‘|| s[j]==‘[‘|| s[j]==‘<‘) 18 a[++t]=s[j]; 19 else 20 if (t==0 || abs(s[j]-a[t])>2){ 21 ok=false; 22 break; 23 } 24 else t--; 25 } 26 if(t==0&&ok) 27 printf("TRUE\n"); 28 else 29 printf("FALSE\n"); 30 } 31 return 0; 32 }
2.codevs6674车厢调度
其实这只是一个栈的模拟,用k表示当前元素,k表示需检查元素,如果有k>po则所有比k小的元素入栈,如果k<=po,判断当前栈顶元素如果等于k,栈顶元素出栈,否则不行输出NO return 0,最后输出YES
1 #include <bits/stdc++.h> 2 bool ok=true; 3 int n,a[1000+5],k,po,t; 4 int main(){ 5 scanf("%d\n",&n); 6 t=0; 7 po=0; 8 for(int i=1;i<=n;i++){ 9 scanf("%d",&k); 10 if(k>po){ 11 for(int j=po+1;j<=k;j++) 12 a[++t]=j; 13 po=k; 14 } 15 if(k<=po){ 16 if(a[t]==k){ 17 t--; 18 } 19 else{ 20 printf("NO\n"); 21 return 0; 22 } 23 } 24 } 25 printf("YES\n"); 26 return 0; 27 }
3.codevs1051接龙游戏
一开始比较晕,一是不知道如何排序,二是不知道如何比较前缀和单词
1.后来看网上大神的程序,利用string类型可以直接用sort不需要cmp函数
2.然后就是发现挨个比较不会超时
一开始如果栈为空,将字符串压入栈,否则看当前元素是否能够和栈顶元素匹配,可以压入栈,否则栈顶元素出栈,ans不断记录最大的栈内元素数,输出即可
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 stack<string> s; 5 string str[100010]; 6 7 bool check(string s,string ss) 8 { 9 if(s==ss) //如果两个字符串相等,则ss不是s的前缀 10 return false; 11 for(int i=0;i<s.length();i++) 12 { 13 if(s[i]!=ss[i]) return false; //逐个比较 14 } 15 return true; 16 } 17 18 int main() 19 { 20 int n; 21 scanf("%d",&n); 22 for(int i=1;i<=n;i++) 23 scanf("%s",str[i]); 24 sort(str+1,str+1+n); 25 int ans=0; 26 for(int i=1;i<=n;i++) 27 { 28 if(s.empty()) 29 s.push(str[i]); //如果栈为空,压入栈 30 else 31 { 32 while(s.size()) //如果字符串大小不为0 33 { 34 if(check(s.top(),str[i])) //如果是它的前缀 35 { 36 s.push(str[i]); //压入栈 37 break; 38 } 39 else s.pop(); //否则栈顶元素出栈 40 } 41 if(s.empty()) 42 s.push(str[i]); //如果栈为空,继续压入 43 } 44 ans=max(ans,(int)s.size()); //取栈中最大元素数 45 } 46 printf("%d",ans);//输出 47 return 0; 48 }