标签: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; }
标签:cf
原文地址:http://blog.csdn.net/jibancanyang/article/details/44781339