hdu2609(最小表示法)
题意:有n个环形字符串,一个环形字符串移动会形成不能的字符串,我们把它们看作同一串字符串,求有多少个不同的字符串.......
思路:用最小表示发将一个环形串的最小字典序找出来,然后让这个环形串按照这个顺序来组成一个新的串,其他串都这样处理,然后去重,输出结果就是了.......
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char s[10005][105]; struct node { char ch[105]; }t[10005]; int cmp(const node a,const node b) { if(strcmp(a.ch,b.ch)<0) return 1; else return 0; } int work(int m,char str[]) { int i,j,l; i=0; j=1; while(i<m && j<m) { for(l=0;l<m;l++) if(str[(i+l)%m]!=str[(j+l)%m]) break; if(l>m) break; if(str[(i+l)%m] > str[(j+l)%m]) i=i+l+1; else j=j+l+1; if(i==j) j=i+1; } if(i<j) return i; return j; } int main() { int n; while(scanf("%d",&n)>0) { for(int i=1;i<=n;i++) scanf("%s",s[i]); for(int i=1;i<=n;i++) { int len=strlen(s[i]); int cnt=work(len,s[i]); strcpy(t[i].ch,s[i]+cnt); s[i][cnt]='\0'; strcpy(t[i].ch+len-cnt,s[i]); } sort(t+1,t+1+n,cmp); int sum=1; for(int i=2;i<=n;i++) { if(strcmp(t[i-1].ch,t[i].ch)!=0) sum++; } printf("%d\n",sum); } return 0; }
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。