您的位置:首页 > 其它

2609HDU

2015-09-17 19:11 429 查看
#include<iostream>

#include<cstdio>

#include<string.h>

#include<string>

#include<stack>

#include<set>

#include<algorithm>

#include<cmath>

#include<vector>

#include<map>

#include<sstream>

#include<queue>

#define ll __int64

#define lll unsigned long long

#define MAX 1000009

#define MAXN 2009

#define eps 1e-8

#define INF 0x7fffffff

#define mod 1000000007

#define clr(a) memset(a,0,sizeof(a))

#define clr1(a) memset(a,-1,sizeof(a))

#define lson l , m , rt << 1

#define rson m + 1 , r , rt << 1 | 1

using namespace std;

inline ll Max(ll a,ll b)

{

return a>b?a:b;

}

inline ll Min(ll a,ll b)

{

return a<b?a:b;

}

int MinRepresstation(string S)//用最小表示法求字符串S的最小字典序 返回字典序最小的串的首字母位置

{

int i = 0, j = 1, k = 0;

int len = S.length();

S += S;

while(i < len && j < len)

{

k = 0;

while(k < len && S[i + k] == S[j + k]) k++;

if(k >= len) break;

if(S[i + k] > S[j + k])

i = max(i + k + 1, j + 1);

else

j = max(i + 1, j + k + 1);

}

return min(i ,j);

}

int main()

{

#ifdef ONLINE_JUDGE

#else

freopen("an.txt","r", stdin);

#endif

int n;

string str;

while(~scanf("%d",&n))

{

int ans = 0;

map<string,int>flag;

for(int i = 0; i<n; i++)

{

cin>>str;

int k = MinRepresstation(str);

string s = "";

for(int j = k;j<k + str.size();j++)

{

int l = j % str.size();

s += str[l];

}

//cout<<s<<" o"<<endl;

if(!flag[s])

{

flag[s] = 1;

ans++;

}

}

printf("%d\n",ans);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: