题目 洛谷(P1739 表达式括号匹配 P3370 【模板】字符串哈希 ) [蓝桥杯2018决赛]约瑟夫环
一.P1739 表达式括号匹配
题干
输入格式与样例
思路简述
每一个左括号对应一个右括号.
遇到左括号则N++,右括号则N - - .
如果先遇到的是右括号的话N会变成负数,所以N<0时直接跳出
如果最后 N!=0(左右括号数量不相等) 则输出 NO 否则输出 YES
源码
#include <stdio.h>
int main(){
char c;
int left=0,right=0,mark=1;
while(scanf("%c",&c)!=EOF&&c!='@'){
if(c=='(')left++;
if(c==')')right++;
if(right>left)mark=0;
}
if(left!=right) mark=0;
puts(mark==0?"NO":"YES");
return 0;
}
使用satck
#include<bits/stdc++.h>
using namespace std;
int main()
{
int mark = 1;
stack<char> s;
while (1) {
char c = getchar();
if (c == '@') {
break;
}
if (c == '(') {
s.push(c);
}
else if(c==')') {
if(s.size()!=0){
s.pop();
}else{
mark=0;
break;
}
}
}
if (s.size() != 0) {
mark=0;
}
puts(mark ? "YES" : "NO");
return 0;
}
二.P3370 【模板】字符串哈希
题干
输入格式与样例
思路简述
首先读一行数据,建立相对应的 hash 表,再与已存在的hash表进行比较,
如果有相同的则跳过,没有则把新的 hash 表添加并且 cont++,
最后输出 cont 的值即可
源码
#include <stdio.h>
int hashmap[10010][10 + 26 + 26] = { 0 };
int len = 0;
int cont = 0;
int is_same(int* a, int* b) {
int i;
for (i = 0; i < 10 + 26 + 26; i++) {
if (a[i] != b[i]) {
return 0;
}
}
return 1;
}
void add(int* hash) {
int i;
for (i = 0; i < 10 + 26 + 26; i++) {
hashmap[len][i] = hash[i];
}
len++;
}
int is_hash_collision(int* hash) {
int mark = 1;
int i;
for (i = 0; i < len; i++) {
if (is_same(hash, hashmap[i]) == 1) {
mark = 0;
break;
}
}
if (mark) {
add(hash);
}
return mark;
}
int main() {
int N;
scanf("%d", &N);
getchar();
while (N-- > 0) {
int hash[10 + 26 + 26] = { 0 };
while (1) {
char c='\n';
c=getchar();
if (c == '\n') {
break;
} if (c >= '0' && c <= '9') {
hash[c - '0']++;
}else if (c >= 'a' && c <= 'z') {
hash[c - 'a' + 10]++;
}else {
hash[c - 'A' + 36]++;
}
}
cont+=is_hash_collision(hash);
}
printf("%d", cont);
return 0;
}
使用ste
#include <bits/stdc++.h>
using namespace std;
int main()
{
int N;
cin >> N;
getchar();
set<string> hash;
while (N-- > 0) {
string a;
getline(cin, a);
sort(a.begin(), a.end());
hash.insert(a);
}
cout << hash.size() << endl;
return 0;
}
三.1388: [蓝桥杯2018决赛]约瑟夫环
题干
输入格式与样例
思路
没有思路,暴力模拟
源码
#include <stdio.h>
int map[1000010]={0};
int N,K,len;
int main(){
scanf("%d %d",&N,&K);
len=N;
int i,o;
while(N!=1){
for(i=1,o=0;;i++){
if(i>len){
i-=len;
}
if(map[i]==0){
o++;
if(o==K){
o=0;
map[i]=-1;
N--;
if(N==1){
break;
}
}
}
}
}
for(i=1;i<=len;i++){
if(map[i]==0){
printf("%d",i);
break;
}
}
return 0;
}