码迷,mamicode.com
首页 > 其他好文 > 详细

Coderforces Round #296(DIV.2)

时间:2015-03-31 18:08:40      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:cf

A题:主要是没有注意到数据有10的12次方那么大,中间要善用取余。

B题:一道思想很巧妙的题,暴力方法O(n^2)超时,用set优化了查找之后O(nlogn)超时,最后无计可施看答案。。。

思路:这个最大的巧妙点是字符串虽然可以很长,但是元素是由小写字母组成的只有26种,而上下不相同的字母组成最多只有26*26种,所以用一个C[26][26]来记录每一种可能不同字母对出现的位置,这样如果有C[i][j],C[j][i]同时存在,就可以达到减少两个的效果了。

我的代码:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#define M 200009
#define INF 1e9
using namespace std;
char str1[M],str2[M];
int A[26],B[26],C[26][26];

int main(void){
    int n,ans=0;
    scanf("%d%s%s",&n,str1,str2);
    for(int i=0;i < n;i++)
        if(str1[i] != str2[i])
            ans++,A[str1[i]-'a']=i+1,B[str2[i]-'a']=i+1,C[str1[i]-'a'][str2[i]-'a']=i+1;
    for(int i=0;i <26;i++){
        for(int j=0;j < 26;j++){
            if(C[i][j] && C[j][i]){
                printf("%d\n%d %d\n",ans-2,C[i][j],C[j][i]);
                return 0;
            }
        }
    }
    for(int i=0;i < 26;i++) if(A[i] && B[i]){printf("%d\n%d %d\n",ans-1,A[i],B[i]);return 0;}
    printf("%d\n-1 -1\n",ans);
    return 0;
}

Coderforces Round #296(DIV.2)

标签:cf

原文地址:http://blog.csdn.net/jibancanyang/article/details/44781339

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!