这题本来不明白是什么意思,还以为是每个串的数字加起来,如果相等就表明是相等的串,但原来不来。
而是--》如果两个串是同构串,那么这两个串相等,为一个相同的串,我们就是要找出给出的数据中有多少不同的串。
这就要用找最小表示法了,如果两个串是同构串,那么这两个串的最小表示S1 == S2
http://blog.youkuaiyun.com/u012501262/article/details/21823363
找出后最小表示S后,存进map容器
最后map.size()的大小就是不同的串的数量
下面是代码:
//http://acm.hdu.edu.cn/showproblem.php?pid=2609
#include<iostream>
#include<string>
#include<map>
#include<cstdio>
using namespace std;
int find_min_subs(string &str);
int main()
{
string str;
int n;
//freopen("d:/in.txt","r",stdin);
while(cin>>n)
{
map<string,int>m;
while(n--)
{
cin>>str;
int index = find_min_subs(str);
string str2(str.begin()+index,str.end());
string str3(str.begin(),str.begin()+index);
str2+=str3;
m[str2];
}
cout<<m.size()<<endl;
}
}
int find_min_subs(string &str)//朴素的寻找法
{
int i;
int j;
int k;
i = 0;
j = 1;
k = 1;
for(;i<str.size() && j<str.size() ;)
{
if(str[i] > str[j])//大于,说明以j开始的串比较小,我们已该串为标准,再找出比它还小的
{
i = j;
j = j+1;
}
else if(str[i] < str[j])//说明j指向的串不是最小的,比较下一个
{
++j;
}
else//相等,不能判断两个字符串哪个小,比较下一位
{
k=1;
while(k<str.size())
{
if(str[(i+k)%str.size()] == str[(j+k)%str.size()])
k++;
else if(str[(i+k)%str.size()] < str[(j+k)%str.size()])
{
j++;
break;
}
else
{
i=j;
j=j+1;
break;
}
}
if(k==str.size())//表明两个同构串相等,取下标比较小的那一个
j++;
}
}
return i;
//返回从第i个字符开始时str的最小表示
}