⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1791.cpp

📁 这是哈尔滨工业大学acmOJ的源代码
💻 CPP
字号:
/*  This Code is Submitted by wywcgs for Problem 1791 on 2006-09-11 at 14:32:08 */ 
#include <cstdio>
#include <cctype>
#include <set>
#include <algorithm>
using namespace std;

const int N = 7;
const int L = 102400;

class Data {
public:
	int n[N];
	Data() { memset(n, 0, sizeof(n)); }
	void add(int, int);
	bool operator <(const Data&) const;
};
bool Data::operator <(const Data& d) const {
	for(int i = 0; i < N; i++)
		if(n[i] != d.n[i]) return n[i] < d.n[i];
	return false;
}
void Data::add(int m, int k) {
	int cnt = (n[m>>2]>>((m&3)<<3))&63;
	n[m>>2] &= ~(255<<((m&3)<<3));
	cnt += k;
	n[m>>2] |= cnt<<((m&3)<<3);
}

int main()
{
	set<Data> s;
	char word[L];
	int k, i, str[L];

	while(scanf("%d", &k) != EOF && k != 0) {
		Data d; getchar();
		gets(word); s.clear();
		int b = 0, e = 0;
		for(i = 0; word[i] != 0; i++) {
			if(!isalpha(word[i])) continue;
			str[e++] = isupper(word[i]) ? word[i]-'A' : word[i]-'a';
			d.add(str[e-1], 1);
			if(e < k) continue;
			else if(s.count(d)) break;
			s.insert(d);
			d.add(str[b++], -1);
		}
		printf("%d\n", i);
	}
	
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -