题目 洛谷(P1739 表达式括号匹配 P3370 【模板】字符串哈希 ) [蓝桥杯2018决赛]约瑟夫环

题目 洛谷(P1739 表达式括号匹配 P3370 【模板】字符串哈希 ) [蓝桥杯2018决赛]约瑟夫环

一.P1739 表达式括号匹配

题干

题目 洛谷(P1739 表达式括号匹配 P3370 【模板】字符串哈希 ) [蓝桥杯2018决赛]约瑟夫环_第1张图片

输入格式与样例

题目 洛谷(P1739 表达式括号匹配 P3370 【模板】字符串哈希 ) [蓝桥杯2018决赛]约瑟夫环_第2张图片

思路简述

每一个左括号对应一个右括号.

遇到左括号则N++,右括号则N - - .

如果先遇到的是右括号的话N会变成负数,所以N<0时直接跳出

如果最后 N!=0(左右括号数量不相等) 则输出 NO 否则输出 YES

源码

#include 
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
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 【模板】字符串哈希

题干

题目 洛谷(P1739 表达式括号匹配 P3370 【模板】字符串哈希 ) [蓝桥杯2018决赛]约瑟夫环_第3张图片

输入格式与样例

题目 洛谷(P1739 表达式括号匹配 P3370 【模板】字符串哈希 ) [蓝桥杯2018决赛]约瑟夫环_第4张图片

思路简述

首先读一行数据,建立相对应的 hash 表,再与已存在的hash表进行比较,

如果有相同的则跳过,没有则把新的 hash 表添加并且 cont++,

最后输出 cont 的值即可

源码

#include 

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 
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决赛]约瑟夫环

题干

题目 洛谷(P1739 表达式括号匹配 P3370 【模板】字符串哈希 ) [蓝桥杯2018决赛]约瑟夫环_第5张图片

输入格式与样例

题目 洛谷(P1739 表达式括号匹配 P3370 【模板】字符串哈希 ) [蓝桥杯2018决赛]约瑟夫环_第6张图片

思路

没有思路,暴力模拟

源码

#include 
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;
}

你可能感兴趣的:(哈希算法,算法,c语言)