CF-798B
题意:
将所有字符串变成相等,只允许将最左边的字符移到最右,问最少要移多少步。
若不能使所有相等,则输出-1、
分别以每一个字符串为模板,将其他的字符串移成和当前字符串相等的情况,再找出步数最少的方案。
附AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int inf=1<<30; 5 6 string s[60]; 7 8 int main(){ 9 int n,i,j,k,m; 10 cin>>n; 11 for(i=0;i<n;i++){ 12 cin>>s[i]; 13 } 14 int len=s[0].size(); 15 int ans=inf; 16 for(i=0;i<n;i++){ 17 int cnt=0; 18 for(j=0;j<n;j++){ 19 for(m=0;m<len;m++){ 20 for(k=0;k<len;k++){ 21 if(s[i][k]!=s[j][(k+m)%len]) 22 break; 23 } 24 if(k==len)//只有len个都相等才表明移动m个字符后两字符串相等 25 break; 26 } 27 if(m==len){//若m==len则表明不能匹配。 28 cnt=inf; 29 break; 30 } 31 cnt+=m; 32 } 33 ans=min(ans,cnt); 34 } 35 if(ans==inf) 36 cout<<-1<<endl; 37 else 38 cout<<ans<<endl; 39 return 0; 40 }