标签:different case 循环 nes max ase space nec long
InputThe input contains multiple test cases.
Each test case include: first one integers n. (2<=n<=10000)
Next n lines follow. Each line has a equal length character string. (string only include ‘0‘,‘1‘).
OutputFor each test case output a integer , how many different necklaces.Sample Input
4 0110 1100 1001 0011 4 1010 0101 1000 0001
Sample Output
1 2
题意:给一些长度相同的01数列,要求求出不相同的个数(经过循环相同的也算相同)
题解:最小表示法(为啥分类到kmp里面?)直接水过了,还以为要kmp之类的呢
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1) #define ll long long #define mod 1000000007 using namespace std; const int N=1000000+5,maxn=1000000+5,inf=1e9+5; int Next[N],slen; string str; void getnext() { Next[0]=-1; int k=-1; for(int i=1;i<slen;i++) { while(k>-1&&str[k+1]!=str[i])k=Next[k]; if(str[k+1]==str[i])k++; Next[i]=k; } } int getmin() { int i=0,j=1,k=0; while(i<slen&&j<slen&&k<slen){ int t=str[(i+k)%slen]-str[(j+k)%slen]; if(!t)k++; else { t>0 ? i=i+k+1 : j=j+k+1; if(i==j)j++; k=0; } } return min(i,j); } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; while(cin>>n){ vector<string>v; for(int i=0;i<n;i++) { cin>>str; slen=str.size(); str=str.substr(getmin(),slen)+str.substr(0,getmin()); bool flag=1; for(int j=0;j<v.size();j++) if(v[j]==str) { flag=0; break; } if(flag)v.push_back(str); } cout<<v.size()<<endl; } return 0; }
标签:different case 循环 nes max ase space nec long
原文地址:http://www.cnblogs.com/acjiumeng/p/6826799.html