codeforces 451D Count Good Substrings 枚舉

   一個只包含a,b字符串,可以將連續若干個相同的字符壓縮成一位,比如abaaabb -> abab,如果一個串壓縮之後是一個迴文串,那麼這個串就是一個good string,現在求給出的串的所有子串裏,長度爲偶數和奇數的good string各有多少個...注意到如果一個串的首尾是相同的,那麼這個串一定是一個good string,首先把頭尾重複的串壓縮成一位(假設是a),那麼所夾的一個是一個兩端爲b的子串,進一步壓縮,直到爲空,a,b是交替並且成對出現的,所以一定是迴文串,那麼只要枚舉原串的每一位,同時記錄一下它之前與他相同的字符在奇數位置,和偶數位置出現的次數,在根據當前位置的奇偶性,就可以累加出最後的答案了。

   

import java.math.BigInteger;  
import java.util.*;
import java.math.*;
public class aaa {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub		
		Scanner cin=new Scanner(System.in);
		String s;
		int a1,a2,b1,b2;
		long ans1,ans2;
		while(cin.hasNext())
		{
			s=cin.next();
			//System.out.println(s);
			ans1=ans2=0;
			a1=a2=b1=b2=0;
			ans1=s.length();
			for (int i=0; i<s.length(); i++)
			{
				if (s.charAt(i)=='a')
				{
					if (i%2==0)
					{
						ans1+=a2;
						ans2+=a1;
					}
					else 
					{
						ans1+=a1;
						ans2+=a2;
					}
					if (i%2==0) a2++;
					else a1++;
				}
				else 
				{
					if (i%2==0)
					{
						ans1+=b2;
						ans2+=b1;
					}
					else 
					{
						ans1+=b1;
						ans2+=b2;
					}
					if (i%2==0) b2++;
					else b1++;
				}
			}
			System.out.printf("%d %d\n",ans2,ans1);
			//System.out.printf("%I64d %I64d\n",ans2,ans1);
			
		}
        

	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章