摘要:本题的难点在于--->看懂题意因为比赛纠结于A的二分,比赛还没结束就暴走睡觉了TUT今天起来看了看B===卧槽题意和A一样恶心啊有木有==回到本题,看明白之后首先映入眼前的就是--->暴力大法好这样必然是可以hack超时的,必须要对串进行处理哪些后缀和前缀相等最常规的莫过于kmp里面的next,从结...
阅读全文
摘要:一个串切成两个,左边如果是回文串加上左边价值,右边如果是回文串加上右边价值,求切一次得到的最大价值扩展KMP:for (i=1;i 2 #include 3 #include 4 using namespace std; 5 int next[500005]; 6 void EKMP(char *s...
阅读全文
摘要:一次将第一个数放到最后一个,求所有不同的数中比原串小的个数,等于个数,大于个数思路:将原串贴在后面,求一遍与原串的EXKMP,然后利用extendif extend[i]>=len 等于原串else if s[i+extend[i]]>s[i] 大于原串else 小于原串然后利用KMPdenext数...
阅读全文
摘要:题意好难懂==给定26个是a-z的密文,然后将给定的字符串符合密文+对应明文的最短串输出注意到前(len+1)/2肯定是密文,然后翻译成明文与后面进行EXKMP只要extend[i]可以到达末尾即为最小,再加上后面翻译即可 1 #include 2 #include 3 #include 4 usi...
阅读全文
摘要:扩展kmp求得是:S,Tentend[i]表示S中i开始的后缀与T最长公共前缀暂时没用从1下标开始的扩展KMP,下次补坑== 1 void EKMP(char s[],char t[],int lens,int lent) 2 { 3 int i,j,p,l,a; 4 next[0]=len...
阅读全文
摘要:来自matrix67,很好用很好理解 1 int find(char *A,char *B,int n,int m) 2 { 3 int i,j=0; 4 for (i=1;i0&&B[j+1]!=A[i]) j=next[j]; 7 if (B[j+1]==A[i]) j++; 8...
阅读全文
摘要:1.大的包含小的,求kmp即可2.一个串的前缀是另一个串的后缀,合并利用next数组 1 #include 2 #include 3 char s1[1000005],s2[1000005],t1[1000005],t2[1000005]; 4 char s[2000005]; 5 int next...
阅读全文
摘要:还是没能熟练掌握巧妙的next数组,把s2接到s1后面,求next数组当next[n]>a||next[b]>b继续求next直到为0或者不满足这两种此时next[n]值就是最大重复串 1 #include 2 #include 3 int next[100005]; 4 char s1[10000...
阅读全文
摘要:if (i%(i-next[i])==0&&i/(i-next[i])>1)循环次方=i/(i-next[i]) 1 #include 2 #include 3 int n,next[1000005]; 4 char s[1000005]; 5 void getnext() 6 { 7 int ...
阅读全文
摘要:dp[i]=dp[next[i]]+1;//dp[i]表示以i结尾能和前面多少前缀匹配,思考ans=sum{dp[i]} 1 #include 2 #include 3 #include 4 using namespace std; 5 int m,dp[200005],next[200005]; ...
阅读全文
摘要:1 #include 2 #include 3 int a[1000005],b[1000005],next[100005]; 4 int main() 5 { 6 int t,i,j,n,m; 7 while (~scanf("%d",&t)) 8 while (t--)...
阅读全文