题意:给n个字符串,看最小移动这个字符串多少次,使得这n个字符串相等。
题解:数据很小,因为相等的状态的字符串一定是在这n个字符串之间,加上这个数据很小,直接暴力一下是可以做的,但是我还是去网上找了一下题解。看了一下,自己写了个string,果然string的作用就是很强,还能直接在原有字符串还能继续增加,通过翻倍字符串,然后加上substr切割字符串的函数,通过比较两者相等。然后来判断每个移动次数。
代码:
#include <iostream> #include <string> #include <string.h> #include <stdlib.h> #include <stdio.h> using namespace std; string s[1000]; int a[1000]; int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b; } int main() { int n,i,j,k,t,flag; while(scanf("%d",&n)!=EOF) { memset(a,0,sizeof(a)); for(i=0;i<n;i++) { cin>>s[i]; } k=s[0].size(); for(i=0;i<n;i++) s[i]=s[i]+s[i]; for(i=0;i<n;i++) { for(j=0;j<n;j++) { flag=0; for(t=0;t<k;t++) { if(s[i].substr(0,k)==s[j].substr(t,k)) { flag=1; a[i]+=t; break; } } } if(!flag) { cout<<-1<<endl; break; } } qsort(a,n,sizeof(a[0]),cmp); if(flag)cout<<a[0]<<endl; } return 0; }