我想要做的是找到一种更快的方法来执行相同的程序,但执行得更快。
#include <cstdio>
#include <cstring>
int main ()
{
int br=0, c, n, b, e, i, q, g;
char t[7000], a[7000];
scanf("%d" ,&n);
for (g=0; g<n; g++) // number of test cases
{
scanf ("%7000s",&t);
c=strlen(t);
scanf ("%7000s",&a);
b=strlen(a);
for (i=0; i<b; i++) // comparing them
{
for (q=0; q<c; q++)
{
if (a[i]==t[q] && a[i]!='\0' && t[q]!='\0')
{
br++;a[i]='\0';t[q]='\0';
}
}
}
printf("%d \n", br);
br=0;
}
return 0;
}
第一次输入:测试用例数量
第二:你必须为每个测试用例输入一个数组和一个B数组
程序必须检查B中是否有与A匹配的常用字母,如果有,则输出它们的数量。
Example input:
2
qwerty
abc
abcde
bcex
Output:
0
3
我需要的是让它跑得更快。 任何帮助都是相关的。 :)
答案 0 :(得分:2)
最好对两个字符串中的每个字符进行哈希处理。每个字符对应一个ASCII值。为两个字符串存储其他数组中每个字符的计数。比较哈希数组。
答案 1 :(得分:1)
将您的输入放在char
的两个已排序容器中,例如deques。然后执行set intersection并测量结果的大小。这应该会显着降低复杂性
修改强>
使用用户输入修改已排序的双端队列的示例
void addChar2Deque(char newChar, std::deque<char> &sorted_cont) {
sorted_cont.insert(std::lower_bound(sorted_cont.begin(), sorted_cont.end(), newChar), newChar);
}
如果您只能输入预取数据,那么您可以对数据进行排序,例如char
大小为N的数组
std::sort(prefetched_data, prefetched_data+N);
在任何情况下,你最终都会得到两个可以与std::set_intersection
进行比较的容器(deque或C数组)
std::vector<char> result;
std::set_intersection(std::begin(cont1), std::end(cont1),
std::begin(cont2), std::end(cont2), std::back_inserter(result));
return result.size();
答案 2 :(得分:0)
为了与C ++标题的C代码保持一致,这是我所提到的查找表方法。由此产生的复杂度为O(N + M),其中N和M是各自字符串的长度。由于这是一个已成定局的结论,每个字符串中的每个字符必须至少访问一次(在这种情况下不超过这个),我在建议算法方面有点舒服,如果不进入asm就很难做得更好袋邻技巧。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
int main()
{
int n;
if (scanf("%d", &n) != 1 || n < 0)
return EXIT_FAILURE;
while (n-- >0)
{
char a[7000], b[7000];
if (scanf ("%7000s", a) == 1 && scanf ("%7000s", b) == 1)
{
unsigned short table[1 << CHAR_BIT] = {0};
unsigned int answer = 0;
const char *p;
for (p=b; *p; ++table[(unsigned char)*p++]);
for (p=a; *p; ++p)
{
if (table[(unsigned char)*p])
{
--table[(unsigned char)*p];
++answer;
}
}
printf("%u\n", answer);
}
}
return EXIT_SUCCESS;
}