Gym101158D Hidden Anagrams(暴力+hash)

Gym101158D-Hidden Anagrams

题意

给出两个字符串s1,s2。

找到s1,s2中的子串使得重组之后能够相同,求这个子串的最大长度

思路

暴力+hash,按长度计算所有子串的hash值,利用set维护,再在另一个字符串中按长度进行查找。对结果进行保存

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
int T;
#include<ctime>

set<ull> st; 

const int MAXN = 4000+10;
char s1[MAXN],s2[MAXN];

const int MAXM = 26;
int num[MAXM];
const ll base = 23333;
const ll MOD = 149999999999873; 

ull hash1(){
	ull ans = 1;
	for(int i=0;i<26;i++){
		ans+= num[i];
		ans*= base;
	}
	return ans;
}

int main() {
    scanf("%s",s1);
    scanf("%s",s2);
    memset(num,0,sizeof(num));
    int len1 = strlen(s1);
	int len2 = strlen(s2);
	int len = min(len1,len2);
	int ans = 0;
	for(int i=1;i<=len;i++){
		st.clear();
		memset(num,0,sizeof(num));
		for(int j=0;j<i;j++)	num[s1[j]-'a']++;
		for (int j=0;j<len1-i;j++) {
			ll cur = hash1();
			st.insert(cur);
			num[s1[j]-'a']--;
			num[s1[j+i]-'a']++;
		}
		st.insert(hash1());
		memset(num,0,sizeof(num));
		for(int j=0;j<i;j++)	num[s2[j]-'a']++;
		for (int j=0;j<len2-i;j++) {
			ll cur = hash1();
			if(st.find(cur)!=st.end())	ans = max(ans,i);
			num[s2[j]-'a']--;
			num[s2[j+i]-'a']++;
		}
		if(st.find(hash1())!=st.end())	ans = max(ans,i);
	} 
	printf("%d\n",ans);
}

posted @ 2018-09-12 21:09  caomp  阅读(296)  评论(0)    收藏  举报