自己当时打算用bfs,,结果MLE了。。
想想简直太傻了。。
没有利用好条件,,条件说只会把最前面的放到最后面去。。
这个时候就应该想到之前看过的,,把两个字符串合并在一起啊。。(这个不是就是KMP的吗。。)(看来是思维没有掌握。。)
分析:肯定是把所有串变成其中一个原本就有的串是最优的。。。(我无法证明。。我是弄了一个各种可能。。)
我的代码奇丑务必,放在最后。。
#include<iostream>
#include<string>
using namespace std;
void change(string &s){
s=s.substr(1)+s.substr(0,1);//这样用。。。 我居然还弄了个string tmp。
}
int main(){
int n;
cin>>n;
string s[n];
for(int i=0;i<n;i++)
cin>>s[i];
int ans=0x7fffffff,sum;
for(int i=0;i<n;i++){
sum=0;
for(int j=0;j<n;j++){
string t=s[j];
while(t!=s[i]){
change(t);
sum++;
if(sum>3000){ans=-1;break;}
}
}
ans=min(ans,sum);
}
cout<<ans<<endl;
}
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
int main() {
int n;
cin>>n;
string s;
vector<string>v,u;
for(int i=0;i<n;i++)
{ cin>>s; v.push_back(s);
s+=s;
u.push_back(s);
}
int a;
int m=10000;
for (int i=0;i<n;i++)
{ int b=0;
for (int j=0;j<n;j++)
{ a=u[j].find(v[i]);//注意 string 的find函数返回的是数组的下标。。是会有0 的,在这里刚好是改变次数。
if (a==-1) {cout<<-1; return 0;}
b+=a;
}
m=min(b,m);
}
cout<<m;
}
我使用二分的。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<stack>
#include<cmath>
#include<map>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
#define INF 1000000000
#define bug1 cout<<"bug1"<<endl;
#define bug2 cout<<"bug2"<<endl;
#define bug3 cout<<"bug3"<<endl;
using namespace std;
#define sf scanf
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a));
string s[55];
vector<string>name;
int n;
int ID(string a){
for(int i=0;i<name.size();++i){
if(a==name[i])return i+1;
}
name.push_back(a);
return name.size();
}
int a[55];
int maxx;
int len;
bool ok(int x){
for(int i=1;i<=maxx;++i){
int tmp=0;
for(int j=1;j<=n;++j){
if(a[j]>i){
tmp+=maxx-(a[j]-i);
}
else tmp+=i-a[j];
}
if(tmp<=x){ return true;}
}
return false;
}
int main(){
while(cin>>n){
cin>>s[1];
for(int i=2;i<=n;++i){
cin>>s[i];
}
len=s[1].length();
string tmp;
maxx=0;
tmp=s[1];
for(int i=0;i<len;++i){
maxx=max(maxx,ID(tmp));
string ttmp=tmp.substr(1,len-1);
tmp=ttmp+tmp[0];
}
for(int i=2;i<=n;++i){
int flag=1;
for(int j=0;j<maxx;++j){
if(s[i]==name[j]){
flag=0;break;
}
}
if(flag){
pf("-1\n");return 0;
}
}
for(int i=1;i<=n;++i){
a[i]=ID(s[i]);
}
int l=0,r=1e5;
while(l<r){
int mid=(r+l)>>1;
if(ok(mid))r=mid;
else l=mid+1;
}
pf("%d\n",r);
}
}