Codeforces 798B - Mike and strings

感觉自己好咸鱼呀……B题写了这么久,虽然可以算作1A(忽略一次少include一个头文件的CE)……

思想很简单,每次选定一个字符串作为目标字符串,然后把其他所有字符串都当做测试字符串,计算出总共需要的步数,再在这些计算出的步数中找到最小的那个就是答案。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 using namespace std;
 5 char str[53][105];
 6 int n;
 7 bool is_equal(char sta[],char tes[],int len)//判断两个字符串是否相等 
 8 {
 9     for(int i=0;i<len;i++)
10     {
11         if(sta[i]!=tes[i]) return false;
12     }
13     return true;
14 }
15 int step(int sta,int tes)//计算从tes测试字符串到sta目标字符串需要多少步 
16 {
17     int cnt=0;
18     int len=strlen(str[sta]);
19     char test[2*len+1];//新建一个test字符串 
20     for(int i=0;i<len;i++) test[i]=str[tes][i];
21     for(int i=0;i<len;i++) test[len+i]=str[tes][i];
22     test[2*len]='\0';
23     //以上三行是做如此的工作:源字符串:“abc”,test字符串:“abcabc”,这样可以方便后续计算步数 
24     while(cnt<len)//计算出从tes测试字符串到sta目标字符串需要cnt步
25     {
26         if(is_equal(str[sta],test+cnt,len)) break;
27         else cnt++;
28     }
29     if(cnt>=len) return -1;//如果跑完一圈依然没有能够找到某次和目标字符串相同,那么就代表ans=-1; 
30     return cnt;
31 }
32 int main()
33 {
34     scanf("%d",&n);
35     for(int i=1;i<=n;i++) scanf("%s",str[i]);
36     int ans=1000000000,flag=1;
37     for(int i=1;i<=n;i++)//枚举目标字符串 
38     {
39         int cnt=0;
40         for(int j=1;j<=n;j++)//枚举测试字符串 
41         {
42             if(i!=j)
43             {
44                 int tmp=step(i,j);
45                 if(tmp==-1){
46                     printf("-1\n");
47                     return 0;
48                 }
49                 else cnt+=tmp;
50             }
51         }
52         if(cnt<ans) ans=cnt; 
53     } 
54     printf("%d\n",ans);
55 }

 



 

posted @ 2017-04-22 00:13  Dilthey  阅读(231)  评论(0)    收藏  举报