HDU-2609 How many(最小表示法)

题目链接

题意:

找出所给字符串中,不同的有几个(循环同构也不能相同)

思路:

求出每个字符串的最小表示,然后用map 去重即可

不会戳这里

AC:

//#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
#include<map>
#include<string.h>
using namespace std;
string s;

int Get_Min(){
	int i = 0, j = 1, k = 0;
	int len = s.length();
	while(i < len && j < len && k < len){
		int t = s[(i + k) % len] - s[(j + k) % len];
		if(t == 0) ++k;
		else if(t < 0){	//s[(i + k)] < s[(j + k)]
			j += k + 1;
			k = 0;
		} else {	// s[(i + k)] > s[(j + k)]
			i += k + 1;
			k = 0;
		}
		if( i == j ) ++j;
	}
	return i < j ? i : j;
}
int main(){
	int T;
	while(cin >> T) {
		map<string, int> mp;
		int Ans = 0;
		mp.clear();
		while(T--){
			cin >> s;
			string ss = "";
			int Start = Get_Min();
			for (int i = Start; i < s.length(); ++i) {
				ss += s[i];
			}
			for(int i = 0; i < Start; ++i) {
				ss += s[i];
			}
			if(mp[ss] == 0){
				mp[ss] = 1;
				Ans ++;
			} 	
		}
		cout << Ans << endl;
	}
	return 0;
}
发布了199 篇原创文章 · 获赞 156 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/Harington/article/details/99553885